Следующая программа 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 С++ в Windows. Результат GCC - это то, чего я ожидал бы. Различаются ли они потому, что MSVC имеет ошибку или потому, что sizeof ("" + 0) undefined? Для обоих компиляторов поведение (то есть, будет ли среднее значение напечатано равным первому значению или последнему значению) одинаково независимо от строкового литерала или целочисленной константы, которую вы используете.
Соответствующей ссылкой в стандарте ANSI C, как представляется, является 6.2.2.1 - Lvalues и обозначения функций:
"За исключением случаев, когда он является операндом оператора sizeof... значение lvalue, которое имеет тип" массив типа ", преобразуется в выражение, которое имеет тип" указатель на тип ", который указывает на начальный элемент объекта массива и не является lvalue".
Здесь, хотя "Исключить" не следует применять, потому что в sizeof ("+ 0) литерал array/string является операндом + not sizeof.