1
int m = 0;

m += m++;

System.out.println(m);

打印到,0 但我认为m会发布增量,最后是1。有人请解释一下。

注意:我知道后增量是如何工作的(至少我认为我知道:P)。但我想弄清楚的是,当我说m + = m++让我们假设它意味着在发送 的值之后m = m + m++评估,在这种情况下,然后评估然后增加 的值,因为后增量。现在如果发生了后增量,为什么没有m++m0m = 0 + 0mm1

4

8 回答 8

4

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

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

为了清楚起见,这个问题也解释了它:“x = x++”之后的x是什么?

于 2013-09-26T11:14:45.140 回答
4

考虑以下规则:

  • a += b相当于a = a + b。因此m += m++等价于m = m + m++
    您可以看到,第一次出现的mat the right vision 在增量之前被评估并产生0

  • m++递增并返回递增前的m原始值。 所以,在你的情况下设置并返回m
    m++m10

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

现在您可以看到您的表达式的评估如下:

  • 右侧的评估产生0并设置m1

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

于 2013-09-26T11:18:09.060 回答
2

事件的顺序是:

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

即这相当于:

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

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

  1. 预增量完成 (++m)。
  2. 评估 RHS (1)
  3. 评估结果被赋值(m=1)。
于 2013-09-26T11:18:42.357 回答
2

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

m += m++;

相当于

temp = m + m++;    ; m is now 1, but temp is 0
m = temp;          ; m is now 0 again
于 2013-09-26T11:22:29.937 回答
1
int m = 0

此时 m 为0

m += m++;

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

m返回0

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

转变m+(m++)0+0(m 是1这一点)

然后将其分配给m最终值m.

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

于 2013-09-26T11:17:38.973 回答
1

在您的代码中

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

最初

m值= 0

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

于 2013-09-26T11:21:07.367 回答
0

嗯 m++ 返回 m 之前的值以递增它,与 ++m 递增然后返回相反,如:

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


 int ++m(int m){
     m = m+1;
     return m; 
}
于 2013-09-26T11:15:45.937 回答
0

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();
    }
}
于 2013-09-26T11:20:59.197 回答