Java语法+

Pin*_*juh 16 java syntax operators

为什么以下语法正确:

x = y+++y;
Run Code Online (Sandbox Code Playgroud)

它意味着什么y++ + yy + ++y意味着什么y * 2 + 1(不确定这一点,但是:非常含糊不清)

但是这种语法不正确:

x = y+++++y;
Run Code Online (Sandbox Code Playgroud)

这应该意味着y++ + ++y,这意味着什么y * 2 + 2

这种语法的错误是否有原因?(编辑:谢谢你解释为什么它是无效的语法,但这不是我对这个问题的意图.)

(编辑:当然我没有在真正的代码中使用它,纯粹是为了解析器/词法分析器;但我想知道为什么解析器不喜欢这个;最后一个例子看起来比第一个看起来更不明确.)

(编辑:

    int i = 0;
    int j = (i = 3)+++i;
Run Code Online (Sandbox Code Playgroud)

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

nos*_*nos 20

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

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

因此,对于y+++++y;解析器/标记器将分解如下:

  • 变量 y
  • operator ++(因为没有+++运算符,++是最符合java语法的)
  • operator ++(因为没有+++运算符,++是最符合java语法的)
  • operator + (这是第一个与语法匹配的东西)
  • 变量 y

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

这意味着x = y+++y;将被解析为y++ + y,这没有任何问题.

  • *扫描*贪婪. (2认同)

Syn*_*tic 10

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

我认为这个:

x = y+++++y;
Run Code Online (Sandbox Code Playgroud)

正在被解析为这样的事情:

x = ((y++)++) + y);
Run Code Online (Sandbox Code Playgroud)

或类似的东西:

x = (y + (++(++y)));
Run Code Online (Sandbox Code Playgroud)

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

Java语言规范列出了此处评估表达式的所有规则.