为什么sizeof int是错误的,而sizeof(int)是正确的?

我们知道sizeof是用于计算任何数据types和expression式大小的运算符,而当操作数是expression式时,括号可以省略。

 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语言显然可以引入一个规则来解决歧义,但我可以想象为什么它没有打扰。 就语言而言,types说明符绝不会在expression式中出现“裸体”,因此不需要规则来parsing第二个*是否是types或算术运算符的一部分。

现有的语法已经解决了sizeof (int *) + 1的潜在歧义。 它是(sizeof(int*))+1而不是 sizeof((int*)(+1))

C ++有一个类似的问题来解决函数式的转换语法。 你可以写int(0) ,你可以写typedef int *intptr; intptr(0); typedef int *intptr; intptr(0); ,但是你不能写int*(0) 。 在这种情况下,解决方法是“裸”types必须是简单的types名称,它不能只是任何可能有空格的旧types标识,或者是标点符号。 也许sizeof可以用相同的限制来定义,我不确定。

从C99标准

6.5.3.4.2
sizeof运算符产生其操作数的大小(以字节为单位),该操作数可以是一个expression式或一个types的括号内的名称。

在你的情况下int既不是expression式也不是加上名字。

在C中使用sizeof运算符有两种方法。语法是这样的:

 C11 6.5.3 Unary operators ... sizeof unary-expression sizeof ( type-name ) 

无论何时使用types作为操作数,都必须使用该语言的语法定义来确定括号。 如果在expression式上使用sizeof,则不需要括号。

C标准给出了一个这样的例子,你可能想在expression式上使用它:

 sizeof array / sizeof array[0] 

但是,为了保持一致性,为了避免与运营商优先级有关的错误,我个人build议不pipe情况如何都要使用()。