为什么结果不是1?

时间:2013-09-26 11:12:45

标签: java

int m = 0;

m += m++;

System.out.println(m);

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

注意:我知道后期增量如何运作(至少我认为我做了:P)。但我想弄清楚的是,当我说m + = m++时我们假设m = m + m++意味着m++会在发送m的值0之后评估m = 0 + 0,{{1}在这种情况下,并评估为m然后增加m的值,因为后增量。现在,如果发生了后期增量,为什么1不是{{1}}

8 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分: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

答案 2 :(得分:2)

事件的顺序是:

  1. 评估RHS(0)
  2. 完成后增量(m ++)。
  3. 分配评估结果(再次m = 0)。
  4. 即。这相当于:

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

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

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

答案 3 :(得分:2)

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

m += m++;

相当于

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

答案 4 :(得分: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

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

答案 5 :(得分:1)

在您的代码中

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

最初

m值= 0

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

答案 6 :(得分: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; 
}

答案 7 :(得分: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();
    }
}