以下无法编译:
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>与函数相对,例如,与printfis相对printf ( <SOMETHING> )。括号属于,printf但不属于sizeof。当sizeof应用到带括号的类型名称时,我想将其视为一无所有-只是“返回”类型。
sizeof ( type-name )其视为自己的一种表达方式。(标准称它为运算符,但( type-name )按通常的意义而言并不是真正的操作数。)