下面无法编译:为什么(以及何时)需要在sizeof之后使用圆括号?
typedef int arr[10];
int main(void) {
return sizeof arr;
}
sizeof.c:3: error: expected expression before ‘arr’
,但如果我将其更改为
sizeof(arr);
一切都很好。为什么?
下面无法编译:为什么(以及何时)需要在sizeof之后使用圆括号?
typedef int arr[10];
int main(void) {
return sizeof arr;
}
sizeof.c:3: error: expected expression before ‘arr’
,但如果我将其更改为
sizeof(arr);
一切都很好。为什么?
这是被指定的语言方式,类型名称必须在此处括号。
假设的语法是这样的:
sizeof unary-expression
sizeof type-name
现在,如下面的表达式将是不明确的:
sizeof int * + 0
它可以是任一sizeof(int *) + 0
sizeof(int) * +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));
的sizeof作为操作者不会在ANSI-C – Grim 2011-05-05 08:44:45
@Kostya可供选择:我的K&R(C语言我的最早描述)的拷贝是很远的地方,我现在无法检查,但我确信它符合C99标准现在所用的“sizeof”基本上与110相同。 'sizeof'是可用,因为之前下由ANSI于1989年 – pmg 2011-05-05 09:09:07
对不起,是我不好标准化.. – Grim 2011-05-05 14:59:02