Следующая программа на C:
#include <stdio.h>
int main(void)
{
printf("%u %u %u\n",sizeof "",sizeof(""+0),sizeof(char *));
return 0;
}
выводит 1 4 4 при компиляции с GCC в Linux, но выводит 1 1 4 при компиляции с Microsoft Visual C ++ в Windows.Результат GCC - то, чего я ожидал.Они отличаются, потому что MSVC имеет ошибку или потому что sizeof ("" + 0) не определен?Поведение обоих компиляторов (т. Е. Равняется ли напечатанное среднее значение первому или последнему значению) одинаково независимо от используемого строкового литерала или целочисленной константы.
Соответствующая ссылка в ANSI CСтандартным представляется 6.2.2.1 - L-значения и обозначения функций:
"За исключением случаев, когда это операнд оператора sizeof ... l-значение, имеющее тип" массив типа ", преобразуется в выражение, которое имееттип 'указатель на тип', который указывает на начальный элемент объекта массива и не является lvalue ".
Здесь, хотя" Except "не должен применяться, потому что в sizeof (" "+ 0) массив /Строковый литерал является операндом +, а не sizeof.