我有一个关于我无法理解的问题。
由于删除空格是编译过程的一部分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...)