Почему оператор 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 92

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 можно было бы определить с помощью то же самое ограничение, я не уверен.

С Стандарт C99

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]

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