Следующая программа печатает один и тот же номер дважды на 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));
}
Согласно this reddit post, НКУ не являются стандартным совместимым в этом отношении, потому что выражение в скобках не в списке исключений для того, когда размытие между матрицами и указателями не происходит.
Этот парень прав? Вот соответствующая стандартная цитата:
исключением случаев, когда это операнд
sizeof
оператора или одноместной&
оператора, или строку символов буквального, используемый для инициализации массива символьного типа, или широкий строковый литерал используется для инициализации массива с типом элемента, совместимым сwchar_t
, значение lvalue, которое имеет тип «массив типа», преобразуется в выражение, которое имеет тип «указатель на тип», который указывает на начальный элемент объекта массива и не является значением lvalue ,
Просто чтобы быть ясно, что он утверждает, что (a)
должен вызвать массив в указатель-распад, потому что круглые скобки не рассматриваются в списке выше (sizeof
оператора, одноместной &
оператора, строковый литерал, как инициализаторе).
Нет, этот парень серьезно запутался –
По его словам, я бы согласился с * terminally confused * – chqrlie
Я не занимался этим этим материалом около 15 лет, но я определенно вспоминаю сценарий с, я думаю , 'sizeof', где наличие или отсутствие круглых скобок было значительным, - определяется, если вы принимаете размер указателя или размер элемента, или что-то в этом роде. –