在Java中,表达式:
n+++n
似乎评估相当于:
n++ + n
尽管事实上+n
是一个有效的一元运算符,其优先级高于算术运算符+
运算符在n + n
。因此编译器似乎假设该运算符不能是一元运算符并解析该表达式。
然而,表达式:
n++++n
无法编译,即使有一个有效的可能性将其解析为:
n++ + +n
++n
and +n
被指定为具有相同的优先级,那么为什么编译器会解决看似不明确的问题n+++n
赞成算术+
但不这样做n++++n
?
首先使用最大咀嚼规则对文件进行标记(转换为标记序列) - 始终获得最长的可能有效标记。您的文本将转换为以下顺序:
n ++ ++ n
这不是有效的表达。
From 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
可能是语法正确的一部分
程序。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)