在 Java 中,表达式:
n+++n
似乎评估为等同于:
n++ + n
尽管它是一个有效的一元运算符+n
,其优先级高于. 所以编译器似乎假设运算符不能是一元运算符并解析表达式。+
n + n
但是,表达式:
n++++n
不编译,即使有一个有效的可能性将其解析为:
n++ + +n
++n
和+n
被指定为具有相同的优先级,那么为什么编译器会解决表面上的歧义以n+++n
支持算术+
但不这样做n++++n
呢?
首先使用最大咀嚼规则对文件进行标记(转换为标记序列) - 始终获得最长可能的有效标记。您的文本将转换为以下序列:
n ++ ++ n
这不是有效的表达方式。
从JLS §3.2:
3.2. 词汇翻译
使用以下三个词汇翻译步骤将原始 Unicode 字符流翻译成一系列标记,依次应用:
将 Unicode 字符的原始流中的 Unicode 转义(第 3.3 节)翻译成相应的 Unicode 字符。\uxxxx 形式的 Unicode 转义,其中 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
可能是语法正确程序的一部分。)