Мы знаем это 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
вызвать какую-то двусмысленность?
Следующее может быть неоднозначным:
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
можно было бы определить с таким же ограничением, я не уверен.
От C99 Standard
6.5.3.4.2
sizeof
Оператор возвращает размер (в байтах) своего операнда, который может быть выражением или именем в скобках
тип.
В твоем случае int
не является ни выражением, ни именем в скобках.
Есть два способа использовать оператор sizeof в C. Синтаксис такой:
C11 6.5.3 Unary operators
...
sizeof unary-expression
sizeof ( type-name )
Всякий раз, когда вы используете тип в качестве операнда, вы должны иметь круглые скобки в соответствии с синтаксическим определением языка. Если вы используете sizeof для выражения, вам не нужны круглые скобки.
Стандарт C дает один такой пример того, где вы можете использовать его в выражении:
sizeof array / sizeof array[0]
Тем не менее, для согласованности и во избежание ошибок, связанных с приоритетом операторов, я бы лично советовал всегда использовать () независимо от ситуации.