在Java中,表达式为:
n+++n
似乎评估为等同于:
n++ + n
尽管+n
是一个有效的一元运算符,其优先级高于+
中的算术n + n
运算符。因此编译器似乎假设运算符不能是一元运算符并解析表达式。
然而,表达式:
n++++n
不编译,即使有一个有效的可能性,它可以解析为:
n++ + +n
++n
和+n
被指定为具有相同的优先级,那么为什么编译器会解决n+++n
中的看似歧义,而不是算术+
,而不是使用n++++n
执行此操作?
答案 0 :(得分:17)
首先使用最大munch规则将文件标记化(转换为标记序列) - 始终获得尽可能长的有效标记。您的文本将转换为以下序列:
n ++ ++ n
这不是有效的表达方式。
来自JLS §3.2:
3.2。词汇翻译
使用以下三个将原始Unicode字符流转换为一系列标记 词汇翻译步骤,依次应用:
Unicode原始流中Unicode转义(§3.3)的转换 字符到相应的Unicode字符。 Unicode转义 形式\ uxxxx,其中xxxx是十六进制值,表示 编码为xxxx的UTF-16代码单元。这个翻译步骤 允许任何程序仅使用ASCII字符表示。
将步骤1产生的Unicode流转换为输入字符和行终止符流(§3.4)。
- 醇>
将步骤2产生的输入字符和行终止符流转换为输入元素序列 (§3.5),在空格(§3.6)和评论(§3.7)之后 丢弃,包括作为终端符号的令牌(§3.5) 句法语法(§2.3)。
每个步骤都使用尽可能长的翻译,即使结果最终没有制作出正确的节目而另一个 词汇翻译会。
(因此,输入字符
a--b
被标记化(§3.5)为a, --, b
, 这虽然不是任何语法正确的程序的一部分 标记化a, -, -, b
可以是语法正确的一部分 程序。)