Java 解析器如何处理模棱两可的一元运算符?
例如,假设您在int x
某处声明,+--x
是完全有效的代码。---x
理论上也是有效的,但是编译器会抛出错误。同样,+~~~~~~+--x
被接受,但~~~~~~++--x
即使它们都可以被解析为有效的表达式,也不能接受。
据我所知,语法是模棱两可的,所以必须在标记化过程中处理,但我找不到任何解释它的东西。
Java 解析器如何处理模棱两可的一元运算符?
例如,假设您在int x
某处声明,+--x
是完全有效的代码。---x
理论上也是有效的,但是编译器会抛出错误。同样,+~~~~~~+--x
被接受,但~~~~~~++--x
即使它们都可以被解析为有效的表达式,也不能接受。
据我所知,语法是模棱两可的,所以必须在标记化过程中处理,但我找不到任何解释它的东西。
---x
是模棱两可的,因为它可能意味着-(--x)
or--(-x)
或-(-(-x))
while+--x
是明确的,因为没有+-(-x)
可能。
正如 Stephen P 所暗示的那样,一元运算符在 Java 中从右到左分组,这意味着这些表达式是模棱两可的,因为不同的运算符可以向右分组。有关一元运算符的规则,请参阅Java 7 规范的第 15.15 节。
编辑
在某种程度上,我认为您已经回答了自己的问题。似乎模棱两可的表达式(例如 ---x)会导致编译错误,因为编译器不知道您想要它做什么。在这些情况下,程序员需要通过使表达式更具体来解决歧义——例如,通过添加括号来消除歧义。