2011-05-05 23 views
61

下面无法编译:为什么(以及何时)需要在sizeof之后使用圆括号?

typedef int arr[10]; 
int main(void) { 
    return sizeof arr; 
} 

sizeof.c:3: error: expected expression before ‘arr’ 

,但如果我将其更改为

sizeof(arr); 

一切都很好。为什么?

+0

的sizeof作为操作者不会在ANSI-C – Grim 2011-05-05 08:44:45

+2

@Kostya可供选择:我的K&R(C语言我的最早描述)的拷贝是很远的地方,我现在无法检查,但我确信它符合C99标准现在所用的“sizeof”基本上与110相同。 'sizeof'是可用,因为之前下由ANSI于1989年 – pmg 2011-05-05 09:09:07

+2

对不起,是我不好标准化.. – Grim 2011-05-05 14:59:02

回答

99

据6.5.3,有对sizeof为以下两种形式:

sizeof unary-expression 
sizeof (type-name) 

因为在你的代码arrtype-name,它必须被括号。

+9

+1和,只是强化了'sizeof'是一个操作符:括号“同属”类型,而不是运营商。 – pmg 2011-05-05 09:10:47

+0

@pmg: 感谢您的澄清!是的,正如您所提到的,该标准表示作为运营商的sizeof'。 – 2011-05-05 09:19:45

+0

K&R的A7.4.8,适合像我这样的后期运动。 – jtniehof 2011-05-05 14:04:16

31

这是被指定的语言方式,类型名称必须在此处括号。

假设的语法是这样的:

sizeof unary-expression sizeof type-name

现在,如下面的表达式将是不明确的:

sizeof int * + 0 

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

这在某种程度上可以在这里指定,并要求类型的名字被加上括号,是解决不确定性的一种方式。

0

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

实施例:

/* 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)); 
相关问题