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行分解为以下伪块(先前评估的值放在方括号中):
评估 x--
评估 --x
评估 [--x] * 5
评估 [--x * 5] + [x--]
评估 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,但由于运算符优先级,不应该是这种情况).
我是盲目的还是只是擅长数学还是什么?
无论优先级规定的操作顺序如何,操作符的操作数始终从左到右进行评估.
这是发生的事情:
--x.设置x为4,产量4.(--x) * 5. x就4在这时,所以评估4 * 5和收益20.x--.收益率4,设定x为3.((--x) * 5) + x--;.添加20到4产生24."3 vs 24".在JLS,第15.7节,指出:
Java编程语言保证运算符的操作数似乎以特定的评估顺序进行评估,即从左到右.