x=10;
y = --x + x++;
System.out.println(y);
// prints 18
根据链接https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html,后缀增量(x ++)的优先级高于前缀增量/减量(--x)。
因此x++
(值10)应在--x
之前执行(值11-1 = 10);所以y=20
。但是' y'变成18岁?
答案 0 :(得分:3)
关联性和优先级确定Java将运算符应用于子表达式的顺序,但它们不确定子表达式的计算顺序。在Java中,子表达式从左到右进行评估(当有选择时)。因此,例如在表达式
A() + B() * C(D(), E())
中,子表达式按{... 1}},A()
,B()
,D()
和E()
的顺序进行评估。虽然C()
出现在D()和E()的左侧,但我们需要C()
和D()
的结果来评估E()
。编写依赖于此行为的代码被认为是不好的风格(并且不同的编程语言可能使用不同的规则)。
这解释了为什么
C()
之前执行和评估
--x
因为它是两个子表达式的总和,所以从左到右计算整个表达式。所以第一个在x++
之前执行(是的,后修复x++
一般有更多优先权,但是这里包含它的子表达式在第一个之后被评估)。
所以,18是正确的,因为你总结了两次9到++
,如下所述
x