关于c ++:为什么sizeof int是错误的,而sizeof(int)是正确的?

Why sizeof int is wrong, while sizeof(int) is right?

我们知道sizeof是用于计算任何数据类型和表达式的大小的运算符,并且当操作数是表达式时,可以省略括号。

1
2
3
4
5
6
7
8
9
10
11
int main()
{
        int a;

        sizeof int;
        sizeof( int );
        sizeof a;
        sizeof( a );

        return 0;
}

sizeof的首次用法是错误的,而其他用法是正确的。

使用gcc进行编译时,将显示以下错误消息:

1
main.c:5:9: error: expected expression before ‘int

我的问题是,为什么C标准不允许这种操作。 sizeof int会引起歧义吗?


以下可能是模棱两可的:

1
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)。在这种情况下,解决方案是"裸"类型必须是一个简单的类型名称,它不能只是任何可能带有空格或尾随标点符号的旧类型ID。不确定sizeof可能具有相同的限制,我不


从C99标准

6.5.3.4.2
The sizeof operator yields the size (in bytes) of its operand, which may be an expression or the parenthesized name of a
type.

在您的情况下,int既不是表达式也不是括号名称。


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

1
2
3
4
C11 6.5.3 Unary operators
...
sizeof unary-expression
sizeof ( type-name )

每当使用类型作为操作数时,都必须通过该语言的语法定义加上括号。如果在表达式上使用sizeof,则不需要括号。

C标准给出了这样一个示例,说明您可能希望在表达式上的何处使用它:

1
sizeof array / sizeof array[0]

但是,为了保持一致性,并避免与运算符优先级相关的错误,我个人建议无论如何都应始终使用()。