我在Java编程测验问题之一中发现了这一点。
public class Calculator {
public static void main(String[] args) {
int i = 0;
Calculator c = new Calculator();
System.out.print(i++ + c.opearation(i));
System.out.print(i);
}
public int operation(int i) {
System.out.print(i++);
return i;
}
}
执行上面的代码段可以得到121
的结果。我期望它是111
。我将解释如何解释它。
+
从右到左执行(参考:operator precedence)。因此,首先调用c.operation(0)
并打印值1
,而不是期望值是0
,因为System.out.print
首先打印i
的值然后递增i值,因为它是后递增运算符。
第二,将i
的值1返回到主体,并且现在执行语句System.out.print(i++ + 1)
。而且,由于i
具有后递增运算符,因此它应该像0 + 1
一样执行,并产生结果1
,将其打印结果表示为2
。
第三,i
的值现在增加到1
,并按预期打印。
简而言之,我期望将值打印为011
,但得到的结果为121
。我不确定我的解释哪里出错了。
答案 0 :(得分:4)
加法运算符具有相同的优先级,并且在语法上 左联想(从左到右)。
int i = 0;
System.out.print(i++ + c.operation(i));
计算i++
,得到左操作数0
,然后将i
递增到1
。
将i(1)
传递到c.operation(i)
,执行System.out.print(i++)
。 打印1
,然后返回2
(正确的操作数)。
i++ + c.operation(i) ---> 0 + 2
,打印2
。
打印1
。