我正在实现一个C编译器,发现了一个有趣的问题。由于&
的优先级高于&&
,因此将其视为第一个操作数与第二个操作数的地址进行按位与运算似乎是合理的:
x && y = (x) & ( &(y) )
C规范的语法概述似乎允许这种解释。我可能漏掉或误读了一些内容?
我对语法的理解:
andExpression := equalityExpression | (andExpression '&' equalityExpression) | ... ... unaryExpression := postfixExpression | ( ('&' | '*' | '+' | '-' | '~' | '!') castExpression ) | ...
&&
在语言语法起作用之前被分解为记号。现代编译器首先生成一个记号流,然后将语言语法应用于该记号流。 - Tom Karzesx = y++++z;
是虚假的 C 代码,即使它被拼写成x = y++ + ++z;
也可以是有效的。最大匹配规则意味着它被标记为x = y ++ ++ + z;
并且在 C 中对第二个++
应用于第一个的结果是不合法的(尽管在 C++ 中似乎至少有一些时间是合法的)。 - Jonathan Leffler&y
永远不可能具有算术类型。 - R.. GitHub STOP HELPING ICE