Почему я получаю разные результаты, когда применяю оператор sizeof? - PullRequest
20 голосов
/ 23 апреля 2011

У меня есть эта программа

#include <stdio.h>
int main()
{
   char arr[100];
   printf("%d", (int)sizeof(0,arr));
}

Она печатает 4 при компиляции в виде файла C и печатает 100 в виде файла C ++.Зачем?Я использую GCC.

Ответы [ 2 ]

34 голосов
/ 23 апреля 2011

В C результат правого операнда оператора запятой имеет тип и значение .В C оператор запятой не дает lvalue.Таким образом, существует преобразование lvalue в rvalue, приводящее к затуханию типа массива в тип указателя.Таким образом, в C вы получаете результат sizeof(char*).

В C ++ результатом выражения с запятой является lvalue.Нет такого преобразования [как в C], и вы получите sizeof(arr), т.е. 100

3 голосов
/ 24 апреля 2011

sizeof - это оператор, а не функция

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

В C ++ это ссылка,так что это все еще массив и его полный размер.

В C, в выражении (что-либо с оператором) обычно тип array of x преобразуется в pointer to x.Но есть специальное исключение для двух операторов: sizeof и &.

Так что имеет значение, будет ли sizeof первым или нет, из-за исключения из правил преобразования.(См. Раздел C99 6.3.2.1. )

Это можно увидеть по-другому, и здесь программа возвращает то же самое в C и C ++.

#include <stdio.h>
int main(void) {
  char arr[100];

  printf("%d\n", (int)sizeof arr);
  printf("%d\n", (int)sizeof(arr + 0));
  return 0;
}

результат на моем Mac:

100
8

† 6.3.2.1 (3) За исключением случаев, когда это операнд оператора sizeof или унарный оператор &, или используется строковый литералчтобы инициализировать массив, выражение с типом '' массив из тип '' преобразуется в выражение с указателем типа '' на тип '', которое указывает на начальный элементобъект массива и не является lvalue.

...