Почему sizeof int неверен, а sizeof (int) верен?

Мы знаем это sizeof является оператором, используемым для вычисления размера любого типа данных и выражения, и когда операнд является выражением, круглые скобки могут быть опущены.

int main()
{
int a;

sizeof int;
sizeof( int );
sizeof a;
sizeof( a );

return 0;
}

первое использование sizeof неправильно, а другие правы.

Когда он скомпилирован с использованием gcc, появится следующее сообщение об ошибке:

main.c:5:9: error: expected expression before ‘int’

Мой вопрос заключается в том, почему стандарт C не допускает такого рода операций. Будет sizeof int вызвать какую-то двусмысленность?

93

Решение

Следующее может быть неоднозначным:

sizeof int * + 1

В том, что (sizeof (int*)) + 1, или же (sizeof(int)) * (+1)?

Очевидно, что язык C мог бы ввести правило для устранения неоднозначности, но я могу себе представить, почему это не беспокоило. При таком языке, спецификатор типа никогда не появляется в выражении «голым», и поэтому нет необходимости в правилах для определения того, * является частью типа или арифметического оператора.

Существующая грамматика уже разрешает потенциальную неопределенность sizeof (int *) + 1, это (sizeof(int*))+1, не sizeof((int*)(+1)),

В C ++ есть схожая проблема, решаемая с помощью синтаксиса приведения в стиле функций. Ты можешь написать int(0) и ты можешь написать typedef int *intptr; intptr(0);, но ты не можешь писать int*(0), В этом случае разрешение заключается в том, что «голый» тип должен быть именем простого типа, это не может быть просто какой-либо идентификатор старого типа, в котором могут быть пробелы или конечная пунктуация. Может быть sizeof можно было бы определить с таким же ограничением, я не уверен.

100

Другие решения

От C99 Standard

6.5.3.4.2
sizeof Оператор возвращает размер (в байтах) своего операнда, который может быть выражением или именем в скобках
тип.

В твоем случае int не является ни выражением, ни именем в скобках.

32

Есть два способа использовать оператор sizeof в C. Синтаксис такой:

C11 6.5.3 Unary operators
...
sizeof unary-expression
sizeof ( type-name )

Всякий раз, когда вы используете тип в качестве операнда, вы должны иметь круглые скобки в соответствии с синтаксическим определением языка. Если вы используете sizeof для выражения, вам не нужны круглые скобки.

Стандарт C дает один такой пример того, где вы можете использовать его в выражении:

sizeof array / sizeof array[0]

Тем не менее, для согласованности и во избежание ошибок, связанных с приоритетом операторов, я бы лично советовал всегда использовать () независимо от ситуации.

6
По вопросам рекламы [email protected]