+ 的 Java 语法

2022-09-03 03:50:34

为什么以下语法正确

x = y+++y;

它的意思是什么或哪个意思是(虽然不确定这一点:非常模糊)y++ + yy + ++yy * 2 + 1

但此语法不正确

x = y+++++y;

这应该意味着,这意味着y++ + ++yy * 2 + 2

此语法不正确是否有原因?(编辑:感谢您解释为什么它是无效的语法,但这不是我对这个问题的意图。

(编辑:当然,我不是在实际代码中使用它,纯粹是为了解析器/词法分析器;但我想知道为什么解析器不喜欢这个;最后一个示例看起来甚至比第一个示例更模糊。

(编辑:

    int i = 0;
    int j = (i = 3)+++i;

也是无效的,虽然它对我来说似乎非常明确,是一个值,因此(值值)然后是值标记。(i = 3)+++i


答案 1

解析是贪婪的,也就是说,它首先寻找最长的匹配令牌。这大大简化了实现(大概)。Java语言规范(3.2)也说

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

因此,对于解析器/分词器,它将分解如下内容:y+++++y;

  • 变量y
  • 运算符(由于没有运算符,因此是与java语法匹配的最长运算符)+++++++
  • 运算符(由于没有运算符,因此是与java语法匹配的最长运算符)+++++++
  • 运算符(这是现在与语法匹配的第一件事)+
  • 变量y

实际上,它是在为变量定义运算符时解析的,但是第一个表达式 () 返回一个值。不能将下一个运算符 () 应用于值。(y++) (++) (+y)++y++++

这意味着这将被解析为 ,这没什么错。x = y+++y;y++ + y


答案 2

简而言之,由于计算 Java 表达式的顺序,解析器认为您正在尝试对表达式使用 ++ 运算符,这是非法的。

我认为这是:

x = y+++++y;

被解析为如下:

x = ((y++)++) + y);

或类似的东西:

x = (y + (++(++y)));

我假设这只是一个学术问题,你实际上并没有试图在现实世界中使用这样的代码。不很好地间隔操作员只会导致痛苦和痛苦。

Java 语言规范在此处列出了计算表达式的所有规则。