15

在 Java 中,表达式:

n+++n

似乎评估为等同于:

n++ + n

尽管它是一个有效的一元运算符+n,其优先级高于. 所以编译器似乎假设运算符不能是一元运算符并解析表达式。+n + n

但是,表达式:

n++++n

不编译,即使有一个有效的可能性将其解析为:

n++ + +n

++n+n被指定为具有相同的优先级,那么为什么编译器会解决表面上的歧义以n+++n支持算术+但不这样做n++++n呢?

4

1 回答 1

18

首先使用最大咀嚼规则对文件进行标记(转换为标记序列) - 始终获得最长可能的有效标记。您的文本将转换为以下序列:

n ++ ++ n

这不是有效的表达方式。

JLS §3.2

3.2. 词汇翻译

使用以下三个词汇翻译步骤将原始 Unicode 字符流翻译成一系列标记,依次应用:

  1. 将 Unicode 字符的原始流中的 Unicode 转义(第 3.3 节)翻译成相应的 Unicode 字符。\uxxxx 形式的 Unicode 转义,其中 xxxx 是十六进制值,表示编码为 xxxx 的 UTF-16 代码单元。此转换步骤允许任何程序仅使用 ASCII 字符来表示。

  2. 将步骤 1 产生的 Unicode 流转换为输入字符和行终止符流(第 3.4 节)。

  3. 将步骤 2 产生的输入字符流和行终止符转换为输入元素序列(第 3.5 节),在丢弃空格(第 3.6 节)和注释(第 3.7 节)之后,这些元素组成了标记(第 3.5 节)它们是句法文法的终结符号(第 2.3 节)。

每一步都使用尽可能长的翻译,即使结果最终不会产生正确的程序,而另一个词汇翻译会。

(因此,输入字符a--b被标记化(第 3.5 节)为a, --, b,这不是任何语法正确程序的一部分,即使标记化a, -, -, b可能是语法正确程序的一部分。)

于 2013-09-05T19:03:31.787 回答