为什么`x && y`没有被解析为`x&(&y)`?

maf*_*afu 5 c parsing

我正在实现一个C编译器,并发现了一个奇怪的问题.由于&优先级高于&&,所以将其视为二进制并且第一个操作数与第二个操作数相比似乎是合理的:

x && y = (x) & ( &(y) )
Run Code Online (Sandbox Code Playgroud)

C规范的语法概述似乎允许这种解释.我可能错过或误读了什么?

我对语法的理解:

andExpression:= equalityExpression | (andExpression'&'equalityExpression)| ...
...
unaryExpression:= postfixExpression | (('&'|'*'|'+'|' - '|'〜'|'!')castExpression)| ...

Lun*_*din 12

C运算符表达式通过称为" maximal munch " 1)的方式进行解析,这意味着从左到右,编译器会查找可以形成有效标记的最长符号块.由于x &&比较长x &,编译器选择前者.

这就是为什么代码x+++1编译,+++x但不是,但+ ++x确实如此.


1) C11§6.4词汇元素4:

如果输入流已被解析为预处理令牌直到给定字符,则下一个预处理令牌是可构成预处理令牌的最长字符序列.

  • @mafu确实在6.4§4(强调我的):"如果输入流已被解析为预处理令牌直到给定字符,则下一个预处理令牌是**可构成预处理令牌的最长字符序列**". (2认同)