Оператор 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
Материал на этой странице устарел, поэтому скрыт из оглавления сайта.
Более новая информация по этой теме находится на странице https://learn.javascript.ru/types.
В JavaScript существует несколько основных типов данных.
В этой главе мы получим о них общее представление, а позже, в соответствующих главах подробно познакомимся с использованием каждого типа в отдельности.
Число «number»
var n = 123; n = 12.345;
Единый тип число используется как для целых, так и для дробных чисел.
Существуют специальные числовые значения Infinity (бесконечность) и NaN (ошибка вычислений).
Например, бесконечность Infinity получается при делении на ноль:
alert( 1 / 0 ); // Infinity
Ошибка вычислений NaN будет результатом некорректной математической операции, например:
alert( "нечисло" * 2 ); // NaN, ошибка
Эти значения формально принадлежат типу «число», хотя, конечно, числами в их обычном понимании не являются.
Особенности работы с числами в JavaScript разобраны в главе Числа.
Число «bigint»
В JavaScript тип «number» не может содержать числа больше, чем 2 53 (или меньше, чем -2 53 для отрицательных). Это техническое ограничение вызвано их внутренним представлением. 2 53 – это достаточно большое число, состоящее из 16 цифр, поэтому чаще всего проблем не возникает. Но иногда нам нужны действительно гигантские числа, например в криптографии или при использовании метки времени («timestamp») с микросекундами.
Тип BigInt был добавлен в JavaScript, чтобы дать возможность работать с целыми числами произвольной длины.
Чтобы создать значение типа BigInt , необходимо добавить n в конец числового литерала:
// символ "n" в конце означает, что это BigInt const bigInt = 1234567890123456789012345678901234567890n;
Более подробно тип данных BigInt мы рассмотрим в отдельной главе BigInt.
Строка «string»
var str = "Мама мыла раму"; str = 'Одинарные кавычки тоже подойдут';
В JavaScript одинарные и двойные кавычки равноправны. Можно использовать или те или другие.
Тип символ не существует, есть только строка.
В некоторых языках программирования есть специальный тип данных для одного символа. Например, в языке С это char . В JavaScript есть только тип «строка» string . Что, надо сказать, вполне удобно.
Более подробно со строками мы познакомимся в главе Строки.
Булевый (логический) тип «boolean»
У него всего два значения: true (истина) и false (ложь).
Как правило, такой тип используется для хранения значения типа да/нет, например:
var checked = true; // поле формы помечено галочкой checked = false; // поле формы не содержит галочки
О нём мы поговорим более подробно, когда будем обсуждать логические вычисления и условные операторы.
Специальное значение «null»
Значение null не относится ни к одному из типов выше, а образует свой отдельный тип, состоящий из единственного значения null :
var age = null;
В JavaScript null не является «ссылкой на несуществующий объект» или «нулевым указателем», как в некоторых других языках. Это просто специальное значение, которое имеет смысл «ничего» или «значение неизвестно».
В частности, код выше говорит о том, что возраст age неизвестен.
Специальное значение «undefined»
Значение undefined , как и null , образует свой собственный тип, состоящий из одного этого значения. Оно имеет смысл «значение не присвоено».
Если переменная объявлена, но в неё ничего не записано, то её значение как раз и есть undefined :
var x; alert( x ); // выведет "undefined"
Можно присвоить undefined и в явном виде, хотя это делается редко:
var x = 123; x = undefined; alert( x ); // "undefined"
В явном виде undefined обычно не присваивают, так как это противоречит его смыслу. Для записи в переменную «пустого» или «неизвестного» значения используется null .
Символы «symbol»
«Символ» представляет собой уникальный идентификатор.
Создаются новые символы с помощью функции Symbol() :
// Создаём новый символ - id let
При создании символу можно дать описание (также называемое имя), в основном использующееся для отладки кода:
// Создаём символ id с описанием (именем) "id" let
Символы гарантированно уникальны. Даже если мы создадим множество символов с одинаковым описанием, это всё равно будут разные символы. Описание – это просто метка, которая ни на что не влияет.
Например, вот два символа с одинаковым описанием – но они не равны:
let id1 = Symbol("id"); let id2 = Symbol("id"); alert(id1 == id2); // false
Более подробно c символами мы познакомимся в главе Тип данных Symbol.
Объекты «object»
Первые 7 типов называют «примитивными».
Особняком стоит восьмой тип: «объекты».
Он используется для коллекций данных и для объявления более сложных сущностей.
Объявляются объекты при помощи фигурных скобок <. >, например:
var user = < name: "Вася" >;
Мы подробно разберём способы объявления объектов и, вообще, работу с объектами, позже, в главе Объекты.
Оператор typeof
Оператор typeof возвращает тип аргумента.
У него есть два синтаксиса: со скобками и без:
- Синтаксис оператора: typeof x .
- Синтаксис функции: typeof(x) .
Работают они одинаково, но первый синтаксис короче.
Результатом typeof является строка, содержащая тип:
typeof undefined // "undefined" typeof 0 // "number" typeof 1n // "bigint" typeof true // "boolean" typeof "foo" // "string" typeof Symbol() // "symbol" typeof <> // "object" typeof null // "object" (1) typeof function()<> // "function" (2)
Последние две строки помечены, потому что typeof ведёт себя в них по-особому.
- Результат typeof null == «object» – это официально признанная ошибка в языке, которая сохраняется для совместимости. На самом деле null – это не объект, а отдельный тип данных.
- Функции мы пройдём чуть позже. Пока лишь заметим, что функции не являются отдельным базовым типом в JavaScript, а подвидом объектов. Но typeof выделяет функции отдельно, возвращая для них «function» . На практике это весьма удобно, так как позволяет легко определить функцию.
К работе с типами мы также вернёмся более подробно в будущем, после изучения основных структур данных.
Итого
Есть 5 «примитивных» типов: number , string , boolean , null , undefined и 6-й тип – объекты object .
Очень скоро мы изучим их во всех деталях.
Оператор typeof x позволяет выяснить, какой тип находится в x , возвращая его в виде строки.
C typeof что это
Есть еще один способ указать тип выражения — typeof. Его синтаксис похож на sizeof , однако семантически конструкция действует как имя типа, определенное с помощью typedef.
Существует 2 способа указать аргумент для typeof : с помощью выражения или с помощью имени типа. Вот пример с выражением:
typeof (x[0](1))
Здесь подразумевается, что x это массив указателей на функции; описываемый тип относится к типу возвращаемых значений функций.
Пример с использованием в качестве аргумента имени типа:
typeof (int *)
Здесь описывается тип указателей на int.
Если вы пишете заголовочный файл, который должен работать при подключении к программам ISO C, то вместо typeof пишите __typeof__ (см. описание альтернативных ключевых слов [2]).
Конструкт typeof может использоваться везде, где можно использовать typedef name. Например, typeof можно использовать в декларации, в приведении типа (cast), или внутри sizeof или typeof.
Операнд typeof оценивается на наличие побочных эффектов тогда и только тогда, когда он является выражением изменяемого типа или именем такого типа.
Использование typeof часто полезно вместе с операторными выражениями (statement expressions, см. [3]). Ниже показан пример, как безопасно определить макрос «максимума», который работает с любыми арифметическими типами, и оценивает каждый из своих аргументов ровно 1 раз:
#define max(a,b) \
typeof (b) _b = (b); \
_a > _b ? _a : _b; >)
Причина появления здесь нижних подчеркиваний в именах локальных переменных — чтобы избежать конфликтов с именами переменных, которые появляются вы выражениях, которыми подменяются аргументы a и b. Когда-нибудь будет изобретена новая форма синтаксиса декларации, которая позволит вам объявлять переменные, область видимости которых начнется только после их инициализаторов; это будет более надежным способом предотвращения подобных конфликтов.
Вот еще примеры использования typeof:
• Объявление y с типом того, на что указывает x:
typeof (*x) y;
• Объявляет y как массив таких значений:
typeof (*x) y[4];
• Декларирует y как массив указателей на символы:
typeof (typeof (char *)[4]) y;
Это эквивалентно традиционному объявлению C:
char *y[4];
Чтобы лучше уяснить смысл объявления с помощью typeof, может быть полезно написать, переписать его с помощью вот таких макросов:
#define pointer(T) typeof(T *)
#define array(T, N) typeof(T [N])
Переписанное таким способом объявление:
array (pointer (char), 4) y;
Таким образом, array (pointer (char), 4) это тип массивов 4 указателей на char.
В GNU C, но не GNU C++, вы можете объявить также тип переменной как __auto_type. В этом случае объявление должно декларировать только одну переменную, декларатором которой должен быть просто идентификатор, объявление должно быть инициализировано, и тип переменной определяется инициализатором; имя переменной не находится в области видимости до инициализатора (на C++, для этой цели вы должны использовать C++11 auto). С помощью __auto_type показанный выше макрос максимума может быть написан вот так:
#define max(a,b) \
typeof (b) _b = (b); \
_a > _b ? _a : _b; >)
Использование __auto_type вместо typeof дает 2 преимущества:
— Каждый аргумент макроса появляется только 1 раз при расширении макроса. Это не дает экспоненциально разрастаться размеру кода расширяемого макроса, когда вызовы этих макросов вложены а аргументы таких макросов.
— Если аргумент макроса имеет изменяемый тип, то при использовании __auto_type он вычисляется только один раз, но дважды при использовании typeof.
[Ссылки]
1. Referring to a Type with typeof site:gcc.gnu.org.
2. gcc: альтернативные ключевые слова.
3. gcc: операторы и объявления в выражениях.
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 совместимым а пользы столько же.