【发布时间】:2014-02-25 12:03:47
【问题描述】:
这里我有以下代码:
int a,b,x;
a=b=1;
x=a+++b;
现在x 的值将是2,因为a 首先是后递增,然后它被添加到b。
以下是编译后的字节码:
0 iconst_1
1 dup
2 istore_2 [b]
3 istore_1 [a]
4 iload_1 [a]
5 iinc 1 1 [a]
8 iload_2 [b]
9 iadd
10 istore_3 [x]
所以表达式将等价于x = (a++) + b。
现在另一个表达式x=a++++b,由于最大咀嚼规则而无法编译。它将变为x = (a++) ++ b,因此会出现编译错误。
x=a+++b的上述行为是因为运算符的优先级 ++还是因为最大咀嚼规则?
【问题讨论】:
-
因为吃得最多。
-
@devnull,JVM 规范或 JLS 中是否提到过,或者您对此有何解释?
-
不应该是 3 吗? a=1, b=1,那么你做 (a++) + b = (1+1)+1 是 3?
-
@CodeChimp
a++递增a但返回其原始值。++a将返回递增值。 -
@Zeeshan 是的,它在规范中被引用。
标签: java operator-precedence unary-operator