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

时间:2012-10-29 11:11:13

标签: c++ c sizeof

我们知道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会导致任何歧义吗?

3 个答案:

答案 0 :(得分:100)

以下内容可能含糊不清:

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可以用相同的限制来定义,我不确定。

答案 1 :(得分:32)

来自C99 Standard

  

6.5.3.4.2
  sizeof运算符产生其操作数的大小(以字节为单位),该操作数可以是表达式或括号的名称。   类型。

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

答案 2 :(得分:6)

有两种方法可以在C中使用sizeof运算符。语法是:

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

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

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

sizeof array / sizeof array[0]

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