Преобразование 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:
При применении к операнду, который имеет тип массива, результатом является общее количество байтов в массиве