这里我有以下代码:
int a,b,x;
a=b=1;
x=a+++b;
现在x
的值为2,因为a
首先后递增,然后将其添加到b
。
以下是编译的字节代码:
0 iconst_1
1 dup
2 istore_2 [b]
3 istore_1 [a]
4 iload_1 [a]
5 iinc 1 1 [a]
8 iload_2 [b]
9 iadd
10 istore_3 [x]
因此表达式将等同于x = (a++) + b
。
现在另一个表达式x=a++++b
由于最大munch规则而无法编译。它将变为x = (a++) ++ b
,因此编译错误。
x=a+++b
的上述行为是因为优先选择 ++还是因为最大咬合规则?
答案 0 :(得分:7)
每个步骤都使用尽可能长的翻译,即使是 结果并不能最终使另一个正确的程序 词汇翻译会。
因此,输入字符 a - b 被标记化(§3.5)为 a , - , b'/ em>的, 这虽然不是任何语法正确的程序的一部分 标记化 a , - , - , b 可以是语法正确的一部分 程序
这可以解释为什么
x=a+++b
被解析为
x=(a++)+b
另一方面,a++++b
被标记为 a ++ , ++ , b ,这会导致错误。
答案 1 :(得分:0)
只有当“++”左侧有变量时,才会识别一元运算符“++”。当你写一个+++ b时,第三个加号是二进制运算符“add”,而第一个运算符(++)是“递增变量1”。当你写“a ++++”时,事情会失败,因为这就像写a<unary increment variable by 1> <add> <add>
并且第一个运算符缺少一个参数。第二对加号不被识别为“增量变量”,因为(a ++)不是变量。
现在有趣的是,Java编译器目前需要空格来正确识别
z = a++ + ++b; // this works
z = a+++++b; // this fails
作为一个旧的编译器编写器,我希望这两个结构应该在语法上被评估为相同(识别两个一元运算符++和++
答案 2 :(得分:0)
Maximal munch是在词法分析器中使用的规则,解析器中的运算符优先级,并且词法分析器在解析器之前在概念上运行。因此,x=a+++b
由于最大的munch规则而变为x=(a++)+b
,而不是运算符优先级:
当词法分析器看到a+++b
时会将其转换为标记[标识a
] [加双] [加] [标识b
]。 [double plus]令牌是由于最大咬合(采用最长匹配,++
长于+
)。然后,无论运算符优先级如何,解析器都只能将其转换为(a ++)+ b。