为什么在包含两者的表达式中在postfix之前评估前缀?

Cei*_*cko 4 java operator-precedence unary-operator

根据Oracle运算符优先级规范,执行如下操作:

x-- // Returns x, then subtracts 1 from x.
Run Code Online (Sandbox Code Playgroud)

应优先于:

--x // Subtracts 1 from x, then returns x.
Run Code Online (Sandbox Code Playgroud)

所以,鉴于下面的小片段,为什么:

int x = 5;
int y = --x * 5 + x--;
System.out.println(x+" vs "+y);
Run Code Online (Sandbox Code Playgroud)

打印3 vs 24而不是3 vs 20

假设运算符优先级的给定顺序,可以将代码段的第2行分解为以下伪块(先前评估的值放在方括号中):

  1. 评估 x--

  2. 评估 --x

  3. 评估 [--x] * 5

  4. 评估 [--x * 5] + [x--]

  5. 评估 y = [--x * 5 + x--]

然后将解决如下:

1点之后 returns 5 sets x to 4

2点以后 sets x to 3 returns 3

3点以后 multiplies 3 by 5 and returns 15

4点以后 adds 15 to 5 and returns 20

5点以后 sets y to 20

为什么返回的值是24而不是20.

PS (如果在x之前评估-x,则得到24,但由于运算符优先级,不应该是这种情况).

我是盲目的还是只是擅长数学还是什么?

rge*_*man 5

无论优先级规定的操作顺序如何,操作符的操作数始终从左到右进行评估.

这是发生的事情:

  1. 评估--x.设置x4,产量4.
  2. 评估(--x) * 5. x4在这时,所以评估4 * 5和收益20.
  3. 评估x--.收益率4,设定x3.
  4. 评估((--x) * 5) + x--;.添加204产生24.
  5. 打印"3 vs 24".

JLS,第15.7节,指出:

Java编程语言保证运算符的操作数似乎以特定的评估顺序进行评估,即从左到右.