Подтвердить что ты не робот

Почему я получаю разные результаты при применении оператора sizeof?

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

sizeof является оператором, а не функцией

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

В С++ это ссылка, поэтому она все еще является массивом и имеет полный размер.

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

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

Вы можете видеть это другим способом, и здесь программа возвращает то же самое в 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.