【问题标题】:What happens here: sum += i++;?这里发生了什么:sum += i++;?
【发布时间】:2021-08-04 02:49:46
【问题描述】:

我有这段简单的代码,但我不明白这部分:sum += i++

int num1 = 5;
int sum = 0;
         
if (num1 < 100) {
    for (int i = 0; i < num1; i++)
        sum += i++; //?
    System.out.println("sum = " + sum);
} else {
    sum = -1;
}
System.out.print(sum);  

我得到的结果是 6,我不明白如何以及为什么。

【问题讨论】:

  • 这看起来是一个很好的使用调试器的候选者,可以逐行执行每一行代码,并逐步查看每个变量的值如何变化。您甚至可以按照此处的答案提供的演练进行操作。
  • @andrewjames 虽然这可能会让您对不断变化的价值观有所了解,但它并不能解释为什么价值观会改变它们的行为方式。
  • 是的 - 我同意,@TiMauzi。答案中的语法解释对此有很大帮助。

标签: java logic increment postfix-operator


【解决方案1】:

sum += i++ 等价于sum = sum + i; i = i + 1


这会将您的代码转换为:

int num1 = 5;
int sum = 0;
         
if (num1 < 100) {
    for (int i = 0; i < num1; i++) //<-- i is incremented
        sum = sum + i; //<-- sum gets incremented by i here
        i = i + 1; //<-- i is incremented again, increment/loop-cycle ratio = 2
    System.out.println("sum = " + sum);
} else {
    sum = -1;
}
System.out.print(sum);  

i 在每个循环周期递增 2,sum 在每个循环周期递增 i


结果是 6,因为:

您开始循环,i 为 0,sum 为 0。

在第一个循环循环中,sum 增加 0,i 增加 2 (2)。

在第二个循环周期中,sum 增加 2 (2),i 增加 2 (4)。

在第三个循环周期,sum 增加 4 (6),i 增加 2 (6)。

此时,i 不再满足条件i &lt; num1 其中num1 为5,并结束循环。

【讨论】:

  • 那为什么我得了 6?
  • 我要补充一点,++ 的位置很重要。例如,如果您有 ++i,则意味着 i 在读取之前增加 1,而 i++ 意味着 i 的值在增加 1 之前被读取
【解决方案2】:

在每一轮中,变量i 在新的循环轮之前(循环头中的i++)递增 sum += i++; 之后.

这导致i0, 2, 4 每次连续,提到的行被调用。在i=4i 被循环递增后,循环停止。因此,sum=0+2+4=6 是您的输出。

这种行为是意料之中的,因为后缀递增,i++ 中的运算符在 变量之后。这意味着isum 的定义之后 递增。如果你类似地尝试前缀符号++i,你应该会得到不同的结果。

【讨论】:

    【解决方案3】:

    循环执行了 3 次,首先 i=0,然后 sum 不递增,因为 i++ 是后递增的,注意每次迭代 i 递增两次。

    第二次迭代 i = 2,第三次迭代 i = 4

    总和 = 0 +2 +4 = 6

    【讨论】:

      【解决方案4】:

      使用纸张编写如下表格,使用调试器和/或在代码中添加更多打印。

      | num1 | sum |  i  | i++ | values before statement is executed, result on next line 
      |      |     |     |     | num1 = 5
      |   5  |     |     |     | sum = 0
      |   5  |  0  |     |     | if (num1 < 100)  // true, exxecute if block
      |   5  |  0  |     |     | for (int i = 0;
      |   5  |  0  |  0  |     | for (.........; i < num1;  // true, iterate
      |   5  |  0  |  0  |     |    ...... i++ // i is increment, old value summed
      |   5  |  0  |  1  |  0  |    sum += " (0)
      |   5  |  0  |  1  |     | for (.........; ........; i++)
      |   5  |  0  |  2  |  1  | for (.........; i < num1;  // true, iterate
      |   5  |  0  |  2  |     |   ...... i++ // i is increment, old value summed|
      |   5  |  0  |  3  |  2  |   sum += " (2)
      |   5  |  2  |  3  |     | // and so on
      .
      .
      .
      

      (调试器启动起来可能有点复杂,但它是了解程序在做什么的好方法,并且对于调试代码几乎必不可少)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-10
        • 1970-01-01
        • 2013-11-03
        • 1970-01-01
        • 2010-12-14
        • 2017-11-14
        • 1970-01-01
        相关资源
        最近更新 更多