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

Yis*_*ang 96 c c++ sizeof

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

int main()
{
        int a;

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

        return 0;
}
Run Code Online (Sandbox Code Playgroud)

第一次使用sizeof是错误的,而其他人则是对的.

当使用gcc编译时,将给出以下错误消息:

main.c:5:9: error: expected expression before ‘int’
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*sop 100

以下内容可能含糊不清:

sizeof int * + 1
Run Code Online (Sandbox Code Playgroud)

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


Jai*_*dra 32

C99标准

6.5.3.4.2
sizeof操作者产生其操作数的大小(以字节为单位),其可以是表达或类型的括号名称.

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

  • 我不明白为什么这会得到7个赞成票.就像三个删除的答案一样,它只是重复规则而不是解释规则存在的原因. (10认同)
  • @larsmans,是的,我同意你的意见.虽然它继续重复规则,但至少,它给出了一条授权阅读. (7认同)
  • 作为C++的非实践者,即使我理解这个答案,如果你能阅读和理解英语,也不确定问题是什么. (4认同)
  • @larsmans如果我们开始试图证明在C99做出的每一个决定,我们将全年都在这里.引用标准与完成讨论的方式一样好. (3认同)

Lun*_*din 6

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

C11 6.5.3 Unary operators
...
sizeof unary-expression
sizeof ( type-name )
Run Code Online (Sandbox Code Playgroud)

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

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

sizeof array / sizeof array[0]
Run Code Online (Sandbox Code Playgroud)

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