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