以下无法编译:
typedef int arr[10];
int main(void) {
return sizeof arr;
}
sizeof.c:3: error: expected expression before ‘arr’
Run Code Online (Sandbox Code Playgroud)
但如果我改成它
sizeof(arr);
Run Code Online (Sandbox Code Playgroud)
一切都好.为什么?
Ise*_*ria 111
根据6.5.3,有两种形式sizeof
如下:
sizeof unary-expression
sizeof ( type-name )
Run Code Online (Sandbox Code Playgroud)
因为arr
在你的代码中是a type-name
,所以必须用括号括起来.
maf*_*fso 40
这是指定语言的方式,类型名称必须在此处加括号.
假设语法看起来像这样:
sizeof unary-expression
sizeof type-name
现在,例如以下表达式将是不明确的:
sizeof int * + 0
Run Code Online (Sandbox Code Playgroud)
它可以是sizeof(int *) + 0
或sizeof(int) * +0
.对于一元表达式不会出现这种歧义,因为附加到表达式的星号不是表达式(但对于某些类型名称,附加一个,也是类型名称).
这里必须指定一些东西,并且要求括号的类型名称是解决歧义的一种方法.