关于 C 中的优先级和结合性的问题



我有一个关于我无法理解的问题。

由于删除空格是编译过程的一部分C那么 C 编译器如何区分以下内容:

案例1:

int x = 2,y=4;
int z = x+++y;
printf("%d", z);//gives 6

案例2:

int x = 2,y=4;
int z = x+ ++y;
printf("%d", z);//gives 7

请注意我在x+后添加的空间,使++粘在y而不是x,但是如果删除空格,这种情况会如何发生?

C 有一个贪婪的从左到右的词法分析器:

http://port70.net/~nsz/c/c11/n1570.html#6.4p4:

如果输入流已解析为预处理令牌,则最多 给定字符,下一个预处理标记是最长的序列 可能构成预处理令牌的字符。

所以+++必须被认为是+++的,而不是+++的。

然后,优先级和关联性确定+++令牌的绑定方式 (http://port70.net/~nsz/c/c11/n1570.html#A.2.1)。

简单地说,后缀运算符比前缀运算符绑定得更紧,前缀运算符比二元运算符绑定得更紧密。所以x++ + y意味着(x++) + (y)而不是(x) (++(+(x))(由于其他原因,这将是荒谬的)(例如,&x->member意味着&(x->member)而不是(&x)->member),但这里的混淆似乎只在于片段是如何标记的。

好吧,词法分析器并没有完全忽略空格,其工作是获取令牌并将其传递给解析器。

在第一种情况下,x+++y的标记被词法分析器找到,而在第二种情况下,x+++y被词法分析器找到。

因此,与其说是运算符优先级(保持不变),不如说是词法分析器解释源代码的方式。

@PSkocik提供了一个非常好的参考。

为了澄清非计算机科学毕业生,令牌是表示语言实体的字符序列,例如变量,运算符,关键字(if,while,for,int,float...)

相关内容

  • 没有找到相关文章

最新更新