【问题标题】:Following snippet doesn't produce expected result以下代码段不会产生预期结果
【发布时间】:2018-08-22 15:27:31
【问题描述】:

我在一个 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;
  }
}

在 sn-p 上面执行会给我121 的结果。我期待它是111。我将解释我是如何解释它的。

+ 加法运算符将从右到左执行(参考:operator precedence)。因此,首先调用c.operation(0) 并打印值1 而我希望该值是0,因为System.out.print 首先打印i 的值,然后增加i 值,因为它是后自增运算符。

其次,i 值 1 被返回到 main 并且语句 System.out.print(i++ + 1) 现在被执行。由于i 具有后增量运算符,它应该像0 + 1 一样执行并产生结果1 将其打印结果为2

第三,i 的值现在增加到 1,并且按预期打印。

简而言之,我希望将值打印为011,但我得到的结果为121。我不确定我的解释哪里出错了。

【问题讨论】:

  • 你把+的优先级弄错了。查看第 11 层的链接文档(加法运算符,not 一元 +):它声明它们是“从左到右”执行的,即 first @ 987654343@ 和 then operation(i)` 现在将得到 1。
  • 你是对的@Thomas。感谢您指出!

标签: java operators increment operator-precedence


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多