Преобразование lvalue в rvalue массива в ISO C

C++ ANSI ISO IEC 14882 2003 Приложение C.1 (стр. 668):

Изменение: результат условного выражения, выражения присваивания или выражения запятой может иметь значение lvalue
Обоснование: C + + является объектно-ориентированным языком, уделяющим сравнительно больше внимания lvalues. Например, функции могут возвращать lvalues.
Влияние на исходную функцию: изменение семантики четко определенной функции. Некоторые выражения C, которые неявно полагаются на преобразования lvalue-rvalue, будут давать разные результаты. Например,

char arr[100];
sizeof(0, arr)

дает 100 в C++ и sizeof(char*) в С.
...

Я читал это только сегодня, и я вспомнил, что через пару месяцев мой друг предложил проблему, которая заключалась в написании функции, которая возвращала бы 0, если она была скомпилирована с C++, и 1, если она была скомпилирована с C. Я решил он использует тот факт, что в C структура была во внешней области видимости. Итак, учитывая эту новую информацию, я решил, что это будет еще одно решение вышеуказанной проблемы, которое я пробовал в Microsoft Visual Studio 2008, но независимо от того, скомпилирован ли он в код на C или C++ sizeof(0, arr) всегда дает 4. Итак, 2 вопроса:

1.Что такое ISO C? Это текущий стандарт C? Это единственный (я слышал, C быстро развивается) 2. Это ошибка Microsoft C++?

ТИА

Редактировать: Извините перепутал с выходом и отредактировал его:

3 ответа

Решение

Или просто C от Microsoft - это не ISO C, а какой-то другой стандартный C (если таковой существует).

Microsoft Visual C все еще поддерживает C89 [только], тогда как другие компиляторы, такие как gcc/clang и т. Д., Также поддерживают C99, который является текущим стандартом.

C99 [Раздел 6.5.17/2] говорит

Левый операнд оператора запятой оценивается как пустое выражение; после его оценки есть точка последовательности. Затем вычисляется правый операнд; результат имеет свой тип и значение.95

Таким образом, результат sizeof (0,arr) было бы sizeof(char*)[из-за неявного lvalue в rvalue преобразование / автоматическое затухание в тип указателя] нет 100*sizeof(char)

sizeof(arr) дал бы 100*sizeof(char) от 6.5.3.4/3

95) Оператор запятой не дает lvalue.


решил, что это будет еще одним решением вышеуказанной проблемы, которое я пробовал на Microsoft Visual Studio 2008, но независимо от того, скомпилирован ли он в C или C++, код sizeof(0, arr) всегда дает 4.

C++ 03 [5.18/1] Оператор запятой

Тип и значение результата - это тип и значение правого операнда; результат - lvalue, если его правый операнд.

Так sizeof(0, arr) = sizeof (arr) и который будет равен 100* sizeof(char) а не = sizeof(char*),

Таким образом, MSVC++ дает неверный результат (в случае кода C++).

ISO C является стандартом C. Текущий C99, но C1x прямо за углом. Если под быстрым вы подразумеваете новый стандарт каждые десять лет или около того, то да, он быстро развивается:-)

Раздел 6.5.3.4/3 ISO C99 гласит:

При применении к операнду, имеющему тип char, unsigned char или char со знаком (или его квалифицированную версию), результатом будет 1.

При применении к операнду, который имеет тип массива, результатом является общее количество байтов в массиве.

Для массивов sizeof возвращает общий размер. Будьте осторожны с массивами, переданными как указатели.

Стандарт C99:

При применении к операнду, который имеет тип массива, результатом является общее количество байтов в массиве

Другие вопросы по тегам