【发布时间】:2015-08-27 16:58:28
【问题描述】:
根据the Oracle operator precedence specification,一个操作如:
x-- // Returns x, then subtracts 1 from x.
应该优先于:
--x // Subtracts 1 from x, then returns x.
那么,鉴于下面的小sn-p,为什么会这样:
int x = 5;
int y = --x * 5 + x--;
System.out.println(x+" vs "+y);
打印3 vs 24 而不是3 vs 20?
阐述
假设给定的运算符优先顺序,可以将 sn-p 的第 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。
附言 (如果您在 x-- 之前评估 --x ,您会得到 24,但由于运算符优先级,它不应该是这种情况。
我是盲人还是数学不好?
【问题讨论】:
-
@AaronKurtzhals 实际上不是那个的副本。在这一点上,OP 知道操作员是如何独立工作的;问题是当它们是同一表达式的一部分时,它们的求值顺序。
-
这只是评估的顺序,与运算符优先级本身并没有太大关系。
标签: java operator-precedence unary-operator