以下无法编译:
typedef int arr[10];
int main(void) {
return sizeof arr;
}
sizeof.c:3: error: expected expression before ‘arr’
但是如果我将其更改为
sizeof(arr);
一切都很好。为什么?
以下无法编译:
typedef int arr[10];
int main(void) {
return sizeof arr;
}
sizeof.c:3: error: expected expression before ‘arr’
但是如果我将其更改为
sizeof(arr);
一切都很好。为什么?
sizeof
基本上与C99 Standard今天的方式相同。sizeof
自1989
Answers:
根据6.5.3,有以下两种形式sizeof
:
sizeof unary-expression
sizeof ( type-name )
由于arr
在您的代码中是type-name
,因此必须加括号。
sizeof
是一个运算符:括号“属于”类型,而不是运算符。
sizeof
为运营商。
sizeof ( type-name )
。但是对于第一种形式,您可以编写例如,sizeof(x)
尽管它看起来像一个函数调用(如果sizeof
不是关键字),但实际上是应用于括号表达式的运算符。那是你的想法吗?
sizeof
在语法上sizeof <SOMETHING>
与函数相对,例如,与printf
is相对printf ( <SOMETHING> )
。括号属于,printf
但不属于sizeof
。当sizeof
应用到带括号的类型名称时,我想将其视为一无所有-只是“返回”类型。
sizeof ( type-name )
其视为自己的一种表达方式。(标准称它为运算符,但( type-name )
按通常的意义而言并不是真正的操作数。)