Следующая программа печатает тот же номер дважды на gcc 4.8.2:
#include <stdio.h>
int main()
{
char a[13];
printf("sizeof a is %zu\n", sizeof a );
printf("sizeof(a) is %zu\n", sizeof(a));
}
В соответствии с этот пост reddit gcc не является стандартно-совместимым в этом отношении, потому что выражение в скобках не входит в список исключений, когда array-to- распад указателя не происходит.
Этот парень прав? Вот соответствующая стандартная цитата:
За исключением случаев, когда это операнд оператора
sizeof
или унарный оператор&
, или литерал строковой буквы, используемый для инициализации массива типа символа, или это широкий строковый литерал, используемый для инициализации массива с помощью тип элемента, совместимый сwchar_t
, значение l, которое имеет тип "массив типа", преобразуется в выражение, которое имеет тип "указатель на тип", который указывает на начальный элемент объекта массива и не является значением l. >
Чтобы быть ясным, он утверждает, что (a)
должен приводить к распаду матрицы к указателю, потому что скобки не покрываются в списке выше (оператор sizeof
, унарный &
, строковый литерал как инициализатор).