Мы знаем, что 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)a
.sizeof +(int)a
имеет преимущество перед*&
фактической компиляцией ;-)+
. Например,sizeof +(char)a == sizeof(int)
из-за целочисленного продвижения, вероятно, будет менее подвержено ошибкам просто заключить круглые скобки, если есть хоть какое-то беспокойство по поводу выражения, размер которого вы пытаетесь взять. Так что я не уверен, что зашел бы так далеко, чтобы назвать это «использование», хотя признаю, что использовал его ...Ответы:
Следующее может быть двусмысленным:
Это
(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
могло быть определено с таким же ограничением, я не уверен.источник
new int*(X)
это было бы неоднозначно, если бы в C ++ не было указано, что оператор new принимает самую длинную строку, которая может быть типом. Думаю, в C ++ они могли бы сделать то же самое с sizeof. Но в C ++ вы можете сказать,sizeof int()
что тогда было бы неоднозначным (тип или значение, инициализированное int?).sizeof int()
будет плохо сформирована ( «неoperator()
дляsize_t
»), который я ожидал бы нежелательно!От стандарта C99
В вашем случае
int
нет ни выражения, ни имени в скобках.источник
Есть два способа использовать оператор sizeof в C. Синтаксис следующий:
Каждый раз, когда вы используете тип в качестве операнда, вы должны иметь круглые скобки в соответствии с определением синтаксиса языка. Если вы используете sizeof в выражении, скобки не нужны.
Стандарт C дает один такой пример того, где вы можете использовать его в выражении:
Однако для согласованности и во избежание ошибок, связанных с приоритетом операторов, я лично посоветовал бы всегда использовать () независимо от ситуации.
источник
sizeof expression
иsizeof(type)
, что объясняется в этом ответе.