为什么(以及何时)需要在sizeof之后使用圆括号?

下面的代码不能编译:

typedef int arr[10]; int main(void) { return sizeof arr; } sizeof.c:3: error: expected expression before 'arr' 

但如果我改变它

 sizeof(arr); 

一切安好。 为什么?

根据6.5.3, sizeof有两种forms,如下所示:

 sizeof unary-expression sizeof ( type-name ) 

由于代码中的arr是一个type-name ,所以必须加上括号。

这是指定语言的方式,types名称必须在这里加上括号。

假设语法如下所示:

sizeof unary-expression sizeof type-name

现在,例如下面的expression式是模糊的:

 sizeof int * + 0 

它可以是sizeof(int *) + 0sizeof(int) * +0 。 一元expression式不会出现这种歧义,因为附加到expression式的星号不是expression式(但对于某些types名称,附加一个,又是types名称)。

这里必须指定一些东西,并要求将types名称加上括号,这是解决歧义的一种方法。

我想这是因为你有typedef 。 如果你删除它,它应该编译。

来自wikipedia的示例:

 /* the following code fragment illustrates the use of sizeof * with variables and expressions (no parentheses needed), * and with type names (parentheses needed) */ char c; printf("%zu,%zu\n", sizeof c, sizeof (int));