我实现了一个C编译器并发现了一个奇怪的问题。由于&
的优先级高于&&
,因此将其视为二进制文件并将第一个操作数视为第二个操作数似乎是合理的:
x && y = (x) & ( &(y) )
C规范的语法概述似乎允许这种解释。我可能会遗漏或误读某些内容吗?
我对语法的理解:
andExpression:= equalityExpression | (andExpression'&' equalityExpression)| ...
...
unaryExpression:= postfixExpression | (('&' |' *' |' +' |' - ' |'〜&# 39; |'!')castExpression)| ...
答案 0 :(得分:12)
C运算符表达式通过称为“maximal munch” 1)的东西进行解析,这意味着从左到右,编译器会寻找可以形成有效符号的最长符号块令牌。由于x &&
长于x &
,编译器会选择前者。
这就是像x+++1
这样的代码编译,+++x
没有编译的原因,但是+ ++x
会这样做。
1) C11 §6.4 Lexical elements ¶4:
如果输入流已被解析为预处理令牌,直到给定的字符,那么 下一个预处理令牌是可构成一个的最长字符序列 预处理令牌。