为什么(以及何时)需要在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 *) + 0
或sizeof(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));