6

C++ ANSI ИСО МЭК 14882 2003 Приложение С.1 (стр 668):именующее к RValue преобразования массива в ISO C

Изменение: Результат условного выражения, выражения присваивания, или запятой выражение может bean lvalue
Обоснование: C + + - это объектно-ориентированный язык, придающий относительно больший упор на lvalues. Например, функции могут возвращать lvalues.
Влияние на оригинальную функцию: переход к семантике четко определенной функции. Некоторые выражения C, которые неявно полагаются на преобразования lvalue-to-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++?

ТИА

Edit: К сожалению смешались с выходом и редактировали:

+1

С MSVC 2010 '' sizeof (0, arr) 'выглядит как' 4' (при компиляции как C++). С g ++ он оценивает значение '100'. –

ответ

1

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

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

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

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

Таким образом, результат 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, обр) всегда 4. выходы

C++ 03 [5.18/1] Разделенный Оператор

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

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

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

+0

@Prasoon: 95) относится к C или C++? –

+0

@Armen: 'C99' [..] Отредактировано мое сообщение для ясности. –

+0

Иногда мне интересно, почему я все еще использую MSVC. Но тогда у них есть потрясающая IDE ... –

5

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

Раздел 6.5.3.4/3 ИСО C99 гласит:

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

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

0

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

C99 стандарт:

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

 Смежные вопросы

  • Нет связанных вопросов^_^