遵循以下摘要无法产生预期的结果

时间:2018-08-22 15:27:31

标签: java operators increment operator-precedence

我在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。我不确定我的解释哪里出错了。

1 个答案:

答案 0 :(得分:4)

Additive Operators

  

加法运算符具有相同的优先级,并且在语法上   左联想(从左到右)。


int i = 0;
System.out.print(i++ + c.operation(i));
  1. 计算i++,得到左操作数0,然后将i递增到1

  2. i(1)传递到c.operation(i),执行System.out.print(i++)打印1 ,然后返回2(正确的操作数)。

  3. i++ + c.operation(i) ---> 0 + 2打印2

  4. 打印1