Почему я получаю разные результаты при применении оператора sizeof?
У меня есть эта программа
#include <stdio.h>
int main()
{
char arr[100];
printf("%d", (int)sizeof(0,arr));
}
Это печатает 4 при компиляции в виде файла C и печатает 100 как файл С++. Зачем? Я использую gcc.
Ответ 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 и С++.
† 6.3.2.1 (3) За исключением случаев, когда он является операндом оператора sizeof или унарного и оператора, или является
строковый литерал, используемый для инициализации массива, выражение, которое имеет тип '' массив типа, является
преобразуется в выражение с типом '' указателем на тип, указывающим на начальный элемент
объект массива и не является lvalue.