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

时间:2011-05-05 08:42:36

标签: c sizeof

以下无法编译:

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

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

但如果我将其更改为

sizeof(arr);
一切都很好。为什么呢?

3 个答案:

答案 0 :(得分:111)

根据6.5.3,sizeof有两种形式如下:

sizeof unary-expression
sizeof ( type-name )

由于代码中的arrtype-name,因此必须将其括起来。

答案 1 :(得分:39)

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

假设语法看起来像这样:

sizeof unary-expression sizeof type-name

现在,例如以下表达式含糊不清:

sizeof int * + 0

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

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

答案 2 :(得分:-3)

我认为这是因为你有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));