为什么 n+++n 有效,而 n++++n 无效?

2022-09-03 14:17:03

在 Java 中,表达式:

n+++n

似乎评估等效于:

n++ + n

尽管这是一个有效的一元运算符,其优先级高于 中的算术运算符。因此,编译器似乎假定运算符不能是一元运算符并解析表达式。+n+n + n

但是,表达式:

n++++n

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

n++ + +n

++n并且被指定为具有相同的优先级,那么为什么编译器为了支持算术而解决了看似模糊的问题,而没有这样做?+nn+++n+n++++n


答案 1

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

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) 之后,这些元素包含作为句法语法 (§2.3) 的终端符号的标记 (§3.5)。

在每一步都使用尽可能长的翻译,即使结果最终没有做出正确的程序,而另一个词法翻译会。

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


答案 2