为什么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情况如何都要使用()。