Intereting Posts
Подсчет слов Добавление `int` для адресации вызывает добавление int 4 раза Синтаксическая ошибка при использовании #define при инициализации массива и в качестве аргументов функции в C? рекурсивная функция для нахождения основных факторов измерение времени выполнения кода в C с помощью команды RDTSC «Использование знакового целочисленного операнда с двоичным побитовым оператором» – при использовании короткого замыкания без знака как рассчитать (раз b), деленное на c, только с использованием 32-битных целых типов, даже если время b не подходит для такого типа Работает ли `break` только для` for`, `while`,` do-while`, `switch ‘и для` if` операторов? Основное значение возврата GCC по умолчанию не равно нулю Время принятое: основная сумма строки Основная сумма столбца Как можно считывать регистры процессора, используя отладчик, работающий на одном CPU? Как найти длину argv в C проблемы с поиском в файлах и каталогах .. программирование окон Почему OPENSSL_cleanse выглядит настолько сложным и небезопасным? RDTSCP по сравнению с RDTSC + CPUID

Почему (и когда) мне нужно использовать круглые скобки после sizeof?

Ниже не удается скомпилировать:

typedef int arr[10]; int main(void) { return sizeof arr; } sizeof.c:3: error: expected expression before 'arr' 

но если я изменю его на

 sizeof(arr); 

Все отлично. Зачем?

В соответствии с 6.5.3 существуют две формы для sizeof :

 sizeof unary-expression sizeof ( type-name ) 

Поскольку arr в вашем коде является type-name , он должен быть заключен в скобки.

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

Предположим, что грамматика выглядела так:

sizeof unary-expression sizeof type-name

Теперь, например, следующее выражение будет неоднозначным:

 sizeof int * + 0 

Это может быть либо sizeof(int *) + 0 либо sizeof(int) * +0 . Эта неоднозначность не возникает для унарных выражений, поскольку звездочка, добавленная к выражению, не является выражением (но для некоторых имен типов, добавляя один, это снова имя типа).

Здесь нужно было указать что-то и требовать, чтобы имена типов были заключены в круглые скобки, это способ решить эту двусмысленность.

Я думаю, это потому, что у вас есть typedef . Если вы удалите его, он должен скомпилироваться.

Пример из Википедии:

 /* the following code fragment illustrates the use of sizeof * with variables and expressions (no parentheses needed), * and with type names (parentheses needed) */ char c; printf("%zu,%zu\n", sizeof c, sizeof (int));