消歧 sizeof

sam*_*249 21 c

使用时,sizeof我总是将它括在括号中,因为它对我来说更容易阅读,即使有时我可以省略它,在下面的第一种情况下

sizeof unary-expression
sizeof ( type-name )
Run Code Online (Sandbox Code Playgroud)

我的问题是括号如何消除编译器的歧义?什么是这样的例子:

sizeof char
Run Code Online (Sandbox Code Playgroud)

对编译器来说会模棱两可吗?

Eri*_*hil 28

如果允许sizeof 类型名称,则sizeof char * + 3可以是:

  • (sizeof (char *)) + 3,这是char *添加到3
  • (sizeof (char)) * (+ 3),这是char乘以的大小+ 3

这两个都是有效的解析并且完全由标准定义(除了实现定义的指针大小)。因此,接受sizeof 类型名称会产生语法或语义无法解决的歧义。

前面的例子

如果允许sizeof 类型名称,则sizeof char [x]可以是(sizeof (char)) [x](如果x是指针或数组,则为有效表达式;下标运算符接受index[array])或sizeof (char [x])(如果x为整数,则为有效表达式;它是x元素数组的大小的char)。此外,语法无法区分这些;两者都是有效的解析。语义规则可以根据 的类型区分它们x,但是您必须先进行解析,然后才能评估语义规则,并且编译器需要某种方式来撤消解析。