C typeof что это
Перейти к содержимому

C typeof что это

  • автор:

C typeof что это

А из каких соображений в языке C++ нет оператора typeof (тоже что и sizeof, только возвращает не размер значения, а тип значения)?

И вообще стандарт языка C++ сейчас развивается или только правятся в нем мелкие дефекты?

От: TepMuHyc
Дата: 12.04.02 11:18
Оценка:

Здравствуйте DarkGray, Вы писали:

DG>А из каких соображений в языке C++ нет оператора typeof (тоже что и sizeof, только возвращает не размер значения, а тип значения)?

Из тех соображений что это не Java. В нем аналогичный (по духу) оператор назван typeid.
А также есть аналогичный Java-вскому оператор каста dynamic_cast.

Правда, для того чтобы их использовать в классе должна быть хотя бы одна
виртуальная функция. (т.е. полиморфизм)

DG>И вообще стандарт языка C++ сейчас развивается или только правятся в нем мелкие дефекты?
Развивается. Правятся. Но до 2005 года (могу ошибаться) стандарт не изменится.
И так пока есть только один компилятор который его поддерживает в полной мере.

____________________
God obviously didn’t debug, hasn’t done any maintenance, and no documentation can be found. Truly amateur work.

От: TepMuHyc
Дата: 12.04.02 11:18
Оценка:

Здравствуйте DarkGray, Вы писали:

DG>А из каких соображений в языке C++ нет оператора typeof (тоже что и sizeof, только возвращает не размер значения, а тип значения)?

Из тех соображений что это не Java. В нем аналогичный (по духу) оператор назван typeid.
А также есть аналогичный Java-вскому оператор каста dynamic_cast.

Правда, для того чтобы их использовать в классе должна быть хотя бы одна
виртуальная функция. (т.е. полиморфизм)

DG>И вообще стандарт языка C++ сейчас развивается или только правятся в нем мелкие дефекты?
Развивается. Правятся. Но до 2005 года (могу ошибаться) стандарт не изменится.
И так пока есть только один компилятор который его поддерживает в полной мере.

____________________
God obviously didn’t debug, hasn’t done any maintenance, and no documentation can be found. Truly amateur work.

От: Mish
Дата: 12.04.02 11:19
Оценка:

Здравствуйте DarkGray, Вы писали:

DG>А из каких соображений в языке C++ нет оператора typeof (тоже что и sizeof, только возвращает не размер значения, а тип значения)?

DG>И вообще стандарт языка C++ сейчас развивается или только правятся в нем мелкие дефекты?

Если компилятор поддерживает RTTI, то можешь пользоваться оператором typeid.
А вообще-то можно обойтись и без информации о типах. Если у меня руки чешутся написать
if (typeid(myObject) == typeid(TObject)).
то значит я неправильно спроетировал иерархию классов.

От: Кирпа В.А.
Дата: 12.04.02 11:24
Оценка:

Здравствуйте DarkGray, Вы писали:

DG>А из каких соображений в языке C++ нет оператора typeof (тоже что и sizeof, только возвращает не размер значения, а тип значения)?

DG>И вообще стандарт языка C++ сейчас развивается или только правятся в нем мелкие дефекты?

Это что например так

double val;
typeof(val) = «double» .

А в какую память компилятор будет помещать строку? Не понятно!

Re[2]: typeof

От: DarkGray http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 12.04.02 11:28
Оценка:

Здравствуйте Кирпа В.А., Вы писали:

КВ>double val;
КВ>typeof(val) = «double» .

КВ>А в какую память компилятор будет помещать строку? Не понятно!
Зачем мне строка, название типа я могу и через typeid получить.

double val; typeof(val) val2 = val;

Re[2]: typeof

От: DarkGray http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 12.04.02 11:29
Оценка:

Здравствуйте TepMuHyc, Вы писали:

TMH>Из тех соображений что это не Java. В нем аналогичный (по духу) оператор назван typeid.
TMH>А также есть аналогичный Java-вскому оператор каста dynamic_cast.

Мне не нужен typeid (typeid возвращает тип на уровне выполнения), мне нужен именно оператор typeof, которые на этапе компиляции возвращет тип выражения.
Часто бывает нужна для template-ов.

templateclass T> Saver < typeof(T::Get()) var; Saver(T &t) < var = t.Get(); >~Saver() < t.Put(var); >>;

Даже, когда я пишу такой код, я должен помнить какого типа была переменная var;

Type container; for (Type::iterator it = var.begin(); it != var.end(); ++it)

А хочется чего-нибудь такого:

Type container; for (typeof(container)::iterator it = var.begin(); it != var.end(); ++it)

Re[3]: typeof

От: Кирпа В.А.
Дата: 12.04.02 11:32
Оценка:

Здравствуйте DarkGray, Вы писали:

DG>Здравствуйте Кирпа В.А., Вы писали:

КВ>>double val;
КВ>>typeof(val) = «double» .

КВ>>А в какую память компилятор будет помещать строку? Не понятно!
DG>Зачем мне строка, название типа я могу и через typeid получить.

DG>Я хочу:
DG>

DG>double val; DG>typeof(val) val2 = val; DG>

Че то я не догнал что у тебя val2

Re[4]: typeof

От: DarkGray http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 12.04.02 11:34
Оценка:

Здравствуйте Кирпа В.А., Вы писали:

DG>>Я хочу:
DG>>

DG>>double val; DG>>typeof(val) val2 = val; DG>>

КВ>Че то я не догнал что у тебя val2

Объявление переменной типа double

Re[3]: typeof

От: DarkGray http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 12.04.02 11:40
Оценка:

Здравствуйте DarkGray, Вы писали:

Извиняюсь, должно быть конечно так:

Type container; for (Type::iterator it = container.begin(); it != container.end(); ++it) < >[ccode] А хочется чего-нибудь такого: [ccode] Type container; for (typeof(container)::iterator it = container.begin(); it != container.end(); ++it)

Re[3]: typeof

От: Vi2 http://www.adem.ru
Дата: 12.04.02 11:49
Оценка: -1

Здравствуйте DarkGray, Вы писали:

DG>Я хочу:

DG>double val; DG>typeof(val) val2 = val;

Для этого существует typedef.
Vita Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[4]: typeof

От: DarkGray http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 12.04.02 11:59
Оценка:

Здравствуйте Vi2, Вы писали:

Vi2>Для этого существует typedef.
Для того чтобы сделать typedef я должен знать тип выражения, а в том то и дело что в общем случае я его не знаю.

std::ifstream ifs("i.txt"); typedef /*и какой type сюда вставлять */ TellgType; TellgType pos = ifs.tellg();

Re[5]: typeof

От: Vi2 http://www.adem.ru
Дата: 12.04.02 12:03
Оценка: -1

Здравствуйте DarkGray, Вы писали:

DG>Для того чтобы сделать typedef я должен знать тип выражения, а в том то и дело что в общем случае я его не знаю.

DG>std::ifstream ifs("i.txt"); DG>typedef /*и какой type сюда вставлять */ TellgType; DG>TellgType pos = ifs.tellg();

Так если ты его не знаешь, компилятор-то его откуда узнает. Мне кажется, это накручивание на пустом месте.
А мой ответ был обусловлен примером. Если

double val; typeof(val) val2 = val;
typedef double myvartype; . myvartype val; myvartype val2 = val;

Vita Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: typeof

От: Юнусов Булат
Дата: 12.04.02 12:11
Оценка:

Здравствуйте TepMuHyc, Вы писали:
TMH>И так пока есть только один компилятор который его поддерживает в полной мере.
А это какой?

Re[6]: typeof

От: DarkGray http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 12.04.02 12:12
Оценка:

Здравствуйте Vi2, Вы писали:

Vi2>Так если ты его не знаешь, компилятор-то его откуда узнает. Мне кажется, это накручивание на пустом месте.

Что значит не знает, а почему тогда sizeof работает?

std::ifstream ifs("i.txt"); std::cout sizeof (ifs.tellg()) "\n";

Re[7]: typeof

От: Vi2 http://www.adem.ru
Дата: 12.04.02 12:17
Оценка: -1

Здравствуйте DarkGray, Вы писали:

DG>Здравствуйте Vi2, Вы писали:

Vi2>>Так если ты его не знаешь, компилятор-то его откуда узнает. Мне кажется, это накручивание на пустом месте.

DG>Что значит не знает, а почему тогда sizeof работает?

DG>std::ifstream ifs("i.txt"); DG>std::cout sizeof (ifs.tellg()) "\n";

А потому что компилятор дотошнее тебя и находит функцию в h-файлах!
А если дать такую возможность с typeof, то потом сам рад не будешь.
И вообще, раз нет такой возможности typeof, то и не о чем говорить: ах, что бы было если б было.

Vita Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: typeof

От: Павел Кузнецов
Дата: 12.04.02 13:50
Оценка:

DG>>А из каких соображений в языке C++ нет оператора typeof (тоже что и sizeof, только возвращает не размер значения, а тип значения)?
TMH>Из тех соображений что это не Java. В нем аналогичный (по духу) оператор назван typeid.

typeid — операция времени выполнения, typeof — времени компиляции.

TMH>И так пока есть только один компилятор который его поддерживает в полной мере.

На сегодняшний день не существует ни одного компилятора, поддерживающего стандарт в полной мере. Лучшие оцениваются процентов на 98%.

Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен

От: Павел Кузнецов
Дата: 12.04.02 14:05
Оценка: 18 (2)

DG>А из каких соображений в языке C++ нет оператора typeof (тоже что и sizeof, только возвращает не размер значения, а тип значения)?

Компилятор gcc поддерживает расширение __typeof. Вполне возможно, что typeof или аналогичная функциональность может войти в следующий стандарт C++.

DG>И вообще стандарт языка C++ сейчас развивается или только правятся в нем мелкие дефекты?

Скорее всего, в новом стандарте C++ изменения коснутся в основном стандартной библиотеки. Почитать об этом можно в интервью со Страуструпом.

Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[3]: typeof

От: TepMuHyc
Дата: 12.04.02 15:52
Оценка:

Здравствуйте Юнусов Булат, Вы писали:

ЮБ>Здравствуйте TepMuHyc, Вы писали:
TMH>>И так пока есть только один компилятор который его поддерживает в полной мере.
ЮБ>А это какой?
Так Comeau.

____________________
God obviously didn’t debug, hasn’t done any maintenance, and no documentation can be found. Truly amateur work.

Re[8]: typeof

От: Dr_Sh0ck
Дата: 13.04.02 04:09
Оценка:

Здравствуйте Vi2, Вы писали:

Vi2>И вообще, раз нет такой возможности typeof, то и не о чем говорить: ах, что бы было если б было.

Да и вообще, енплохо было бы почитать «Дизайн и эволюция языка С++». Там приводится много ответов на потенциальные «если бы».

Do not fake yourself 😉
ICQ#: 198114726
Re[4]: typeof

От: Anatolix https://www.linkedin.com/in/anatolix/
Дата: 17.04.02 09:45
Оценка:

Здравствуйте TepMuHyc, Вы писали:

TMH>Здравствуйте Юнусов Булат, Вы писали:

ЮБ>>Здравствуйте TepMuHyc, Вы писали:
TMH>>>И так пока есть только один компилятор который его поддерживает в полной мере.
ЮБ>>А это какой?
TMH>Так Comeau.

Твое мнение ошибочно, и похоже основано на заверении разработчиков
компилятора. Borland тоже называет свой компилятор Ansi совместимым
а пользы столько же. И Intel называет и KAI.

Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев

Re[5]: typeof

От: Юнусов Булат
Дата: 17.04.02 10:26
Оценка:

Здравствуйте Anatolix, Вы писали:

A>Твое мнение ошибочно, и похоже основано на заверении разработчиков
A>компилятора. Borland тоже называет свой компилятор Ansi совместимым
A>а пользы столько же. И Intel называет и KAI.

A>Посмотри вот здесь и все cтанет понятно:
A>http://www.boost.org/status/cs-win32.html
A>http://www.boost.org/status/cs-linux.html

Re[5]: typeof

От: Павел Кузнецов
Дата: 17.04.02 13:35
Оценка: 4 (1)

TMH>>>>И так пока есть только один компилятор который его поддерживает в полной мере.
ЮБ>>>А это какой?
TMH>>Так Comeau.

A>Твое мнение ошибочно, и похоже основано на заверении разработчиков компилятора.

Пожалуйста, избегайте подобных непроверенных заявлений. Greg Comeau никогда не утверждал, что его компилятор обеспечивает 100% поддержку стандарта. Тем не менее, на сегодняшний день, компилятор Comeau действительно считается одним из самых близких к стандарту.

A>Borland тоже называет свой компилятор Ansi совместимым а пользы столько же.

Оператор typeof

Оператор typeof позволяет определить тип параметра (число, строка, объект). Оператор возвращает строку, содержащую тип ( ‘number’ , ‘string’ , ‘object’ ).

Для null оператор возвращает ‘object’ (это признанная ошибка языка). Для функций оператор возвращает ‘function’ . Это сделано для удобства, так как типа ‘function’ не существует.

Синтаксис

У оператора typeof есть 2 синтаксиса (оба синтаксиса работают одинаково):

typeof параметр; typeof(параметр);

Пример

Давайте посмотрим, как typeof работает с числом:

В результате выполненного кода мы получим значение number :

Пример

Теперь давайте зададим в параметре строку:

typeof ‘str’;

Результат выполнения кода:

Пример

Теперь укажем в параметре булевое значение true :

typeof true;

Результат выполнения кода:

Пример

Давайте посмотрим какой тип у значения undefined :

typeof undefined;

После выполнения кода мы получим также undefined :

Пример

Теперь давайте узнаем тип пустого объекта:

Результат выполнения кода:

Пример

А теперь узнаем тип пустого массива:

В результате также получим ‘object’ :

Пример

Давайте узнаем тип значения null :

typeof null;

В результате также получим ‘object’ , что является признанной ошибкой языка:

Пример

Теперь определим тип пустой функции:

typeof function() <>;

После выполнения кода мы получим ‘function’ , несмотря на то, что такого типа не существует. Данная строка нужна для удобства пользователя при определении функции:

Пример

Напишем функцию, которая будет выводить только числа:

function printNumber(number) < if (typeof number === 'number') < console.log(number); >> printNumber(2); printNumber(‘str’); printNumber(3);

Смотрите также

  • функцию isNaN ,
    которая осуществляет проверку на NaN
  • функцию isFinite ,
    которая проверяет число на конечность

typeof

Оператор typeof возвращает строку, указывающую тип операнда.

Интерактивный пример

Синтаксис

Операнд следует за оператором typeof :

typeof operand

Параметры

operand является выражением, представляющим объект или примитив, тип которого должен быть возвращён.

Описание

В следующей таблице приведены возможные возвращаемые значения typeof . Дополнительная информация о типах и примитивах находится на странице структуры данных JavaScript.

Type Result
Undefined «undefined»
Null «object» (смотрите ниже)
Boolean «boolean»
Number «number»
String «string»
Symbol (новый тип из ECMAScript 2015) «symbol»
Host object (определено JS окружением) Зависит от реализации
Function object (реализует [[Call]] в терминах ECMA-262) «function»
Любой другой тип «object»

Примеры

// Числа typeof 37 === "number"; typeof 3.14 === "number"; typeof 42 === "number"; typeof Math.LN2 === "number"; typeof Infinity === "number"; typeof NaN === "number"; // несмотря на то, что это "Not-A-Number" (не число) typeof Number(1) === "number"; // никогда не используйте эту запись! // Строки typeof "" === "string"; typeof "bla" === "string"; typeof "1" === "string"; // обратите внимание, что число внутри строки всё равно имеет тип строки typeof typeof 1 === "string"; // typeof всегда вернёт в этом случае строку typeof String("abc") === "string"; // никогда не используйте эту запись! // Booleans typeof true === "boolean"; typeof false === "boolean"; typeof Boolean(true) === "boolean"; // никогда не используйте эту запись! // Символы typeof Symbol() === "symbol"; typeof Symbol("foo") === "symbol"; typeof Symbol.iterator === "symbol"; // Undefined typeof undefined === "undefined"; typeof declaredButUndefinedVariable === "undefined"; typeof undeclaredVariable === "undefined"; // Объекты typeof  a: 1 > === "object"; // используйте Array.isArray или Object.prototype.toString.call // чтобы различить обычные объекты и массивы typeof [1, 2, 4] === "object"; typeof new Date() === "object"; // То что ниже приводит к ошибкам и проблемам. Не используйте! typeof new Boolean(true) === "object"; typeof new Number(1) === "object"; typeof new String("abc") === "object"; // Функции typeof function () > === "function"; typeof class C > === "function"; typeof Math.sin === "function"; 

null

// Это было определено с рождения JavaScript typeof null === "object"; 

В первой реализации JavaScript значения были представлены парой тип тега и значение. Тип тега для объектов равнялся 0. null был представлен как нулевой указатель (0x00 в большинстве платформ). Следовательно, тип тега для null равнялся нулю, поэтому возвращаемое значение typeof является фиктивным. (подробнее)

Исправление было предложено в ECMAScript (через отключение), но было отклонено. Это привело бы к тому, что typeof null === ‘null’ .

Использование оператора new

// Все функции-конструкторы, созданные с помощью 'new', будут иметь тип 'object' var str = new String("String"); var num = new Number(100); typeof str; // Вернёт 'object' typeof num; // Вернёт 'object' // Но существует исключение для конструктора Function var func = new Function(); typeof func; // Вернёт 'function' 

Регулярные выражения

Вызываемые регулярные выражения были нестандартным дополнением в некоторых браузерах.

typeof /s/ === "function"; // Chrome 1-12 Не соответствует ECMAScript 5.1 typeof /s/ === "object"; // Firefox 5+ Соответствует ECMAScript 5.1 

Ошибки, связанные с временными мёртвыми зонами

До ECMAScript 2015, гарантировалось, что оператор typeof вернёт строку для любого операнда, с которым он был вызван. Это изменилось после добавления не поднимающихся объявлений let and const с блочной областью видимости. Теперь, если переменные объявлены с помощью let и const , и для них вызывается typeof в блоке объявления переменных, но до объявления, то выбрасывается ReferenceError . Поведение отличается от необъявленных переменных, для которых typeof вернёт ‘undefined’. Переменные с блочной областью видимости находятся в «временной мёртвой зоне», которая длится от начала блока до момента объявления переменных. В этой зоне попытка доступа к переменным выбрасывает исключение.

typeof undeclaredVariable === "undefined"; typeof newLetVariable; let newLetVariable; // ReferenceError typeof newConstVariable; const newConstVariable = "hello"; // ReferenceError 

Исключения

Во всех текущих браузерах существует нестандартный host-объект document.all , который имеет тип Undefined.

typeof document.all === "undefined"; 

Хотя спецификация разрешает собственные имена типов для нестандартных экзотических объектов, требуется чтобы эти имена отличались от предопределённых. Ситуация, когда document.all имеет тип undefined должна рассматриваться как исключительное нарушение правил.

Спецификации

Specification
ECMAScript Language Specification
# sec-typeof-operator

Совместимость с браузерами

BCD tables only load in the browser

IE-специфичные замечания

В IE 6, 7 и 8 многие host-объекты являются объектами, но не функциями. Например:

typeof alert === "object"; 

Смотрите также

  • instanceof
  • Why typeof is no longer «safe»

Found a content problem with this page?

  • Edit the page on GitHub.
  • Report the content issue.
  • View the source on GitHub.

This page was last modified on 7 авг. 2023 г. by MDN contributors.

Your blueprint for a better internet.

MDN

Support

  • Product help
  • Report an issue

Our communities

Developers

  • Web Technologies
  • Learn Web Development
  • MDN Plus
  • Hacks Blog
  • Website Privacy Notice
  • Cookies
  • Legal
  • Community Participation Guidelines

Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998– 2023 by individual mozilla.org contributors. Content available under a Creative Commons license.

typeof operator in C

Is typeof in C, really an operator?
I’m thinking because there is no polymorphism in C, that there is nothing to do at run-time. That is, the answer to typeof is known at compile-time. (I can’t think of a use of typeof that would not be known at compile time.) So it appears to be more of a compile-time directive, than an operator. Does typeof use any (processor) run-time (in GCC)?

asked Aug 22, 2012 at 21:12
2,793 6 6 gold badges 33 33 silver badges 37 37 bronze badges
C has no typeof operator, that is a compiler extension.
Aug 22, 2012 at 21:16

@EdS. I’m patiently waiting for the day where I can flag your comment for being outdated, no offence. 🙂

Nov 17, 2021 at 17:26

@user426 I’m finna become a Jedi master waiting this long for the C23 committee to add no language features *sobs into pillow*.

Apr 8, 2022 at 12:10

5 Answers 5

Since typeof is a compiler extension, there is not really a definition for it, but in the tradition of C it would be an operator, e.g sizeof and _Alignof are also seen as an operators.

And you are mistaken, C has dynamic types that are only determined at run time: variable modified (VM) types.

size_t n = strtoull(argv[1], 0, 0); double A[n][n]; typeof(A) B; 

can only be determined at run time.

Add on in 2021: there are good chances that typeof with similar rules as for sizeof will make it into C23.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *