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.