【问题标题】:Why is the result not 1? [duplicate]为什么结果不是 1? [复制]
【发布时间】:2013-10-02 07:52:28
【问题描述】:
int m = 0;

m += m++;

System.out.println(m);

打印到0 但我认为m 将被增加,最后是1。 有人请解释一下。

注意:我知道后增量是如何工作的(至少我认为我知道:P)。但我想弄清楚的是,当我说m + = m++ 时,假设它意味着m = m + m++,它将在发送m0 的值之后评估m++,在这种情况下,评估为@987654330 @ 然后增加 m 的值,因为后增量。现在如果发生后增量,为什么m不是1

【问题讨论】:

  • @kark "我认为 m 会在后递增并最终为 1"

标签: java


【解决方案1】:

m++ 返回m 然后递增它。

将其更改为++m,您将看到1

为了清楚起见,这个问题也解释了它:What is x after "x = x++"?

【讨论】:

  • OP 说打印到0;
  • @TheKojuEffect 确实如此,如果按照此处所述进行更改,它将打印 1. 你的观点?
  • 这并没有解释 OP 示例中增加的 m 会发生什么。
  • @EJP 这并不能解释这个问题。
  • 虽然这个答案不正确。它没有解释为什么 m == 0 在它“应该”根据不了解评估顺序的人增加之后的根本原因。
【解决方案2】:

嗯,m++ 是先返回 m 的值来增加它,而 ++m 是先增加然后返回,比如:

 int m++(int m){
     int tmp = m;
     m = m+1;
     return tmp; 
}


 int ++m(int m){
     m = m+1;
     return m; 
}

【讨论】:

  • 呃... wat 是m++(int m) 顺便说一句..?
  • 只是野蛮地代表函数行为。
【解决方案3】:
int m = 0

此时m是0

m += m++;

扩展到m=m+(m++)

m 返回0

m++ 返回 m 的值 0,然后将其递增到 1

m+(m++)转化为0+0(m为1这一点)

然后将其分配给m,从而产生m 的最终值。

提示:当您触摸该值时避免后增量,否则

【讨论】:

    【解决方案4】:

    考虑以下规则:

    • a += b 等价于a = a + b。因此m += m++ 等价于m = m + m++
      你可以看到m在右边的第一次出现在增量之前被评估并产生0

    • m++ 递增 m 并返回递增前 m 的原始值。
      因此,在您的情况下,m++m 设置为 1 并返回 0

    • 赋值发生在右侧评估之后,而后增量发生在右侧评估期间。

    现在您可以看到您的表达式的计算方式如下:

    • 右侧的求值产生0并将m设置为1

    • 赋值将 m 设置为右侧的值 (0)

    【讨论】:

      【解决方案5】:

      事件的顺序是:

      1. RHS 已评估 (0)
      2. 后增量已完成 (m++)。
      3. 评估结果被赋值(m=0 再次)。

      即这相当于:

      tmp = m;
      m++;
      m = tmp;
      

      如果你做了 m = ++m,那么序列将是:

      1. 预增量已完成 (++m)。
      2. 评估 RHS (1)
      3. 已分配评估结果 (m=1)。

      【讨论】:

      • +1,因为您的提交在我之前提交。
      【解决方案6】:

      f 是您的代码。 g 是一个扩展版本,显示了为什么它们都打印0

      class Test {
          private static void f() {
              int x = 0;
              x += x++;
              System.out.println(x);
          }
      
          private static void g() {
              int x = 0;
              int preInc = x; // preInc = 0
              x += 1;         // x = 1
              x = preInc;     // x = 0
              System.out.println(x);
          }
      
          public static void main(String[] args) {
              f();
              g();
          }
      }
      

      【讨论】:

        【解决方案7】:

        在你的代码中

        m+ =m++; 结果 -- >> M 值 + (增加后的 m 值(m++))

        最初

        m 值= 0

        后增量(m++)m值=0(前增量(++m)=1)

        【讨论】:

          【解决方案8】:

          回答:作业会在执行作业之前评估副作用

          m += m++;
          

          等价于

          temp = m + m++;    ; m is now 1, but temp is 0
          m = temp;          ; m is now 0 again
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-03-08
            • 1970-01-01
            • 1970-01-01
            • 2016-09-05
            • 2021-02-24
            • 2012-11-02
            相关资源
            最近更新 更多