C ++:后增量产生相同的值

时间:2014-10-06 08:01:15

标签: c++

以下增量后续结果如下:

n = 1;
j = n++;  //j = 1, n = 2
j = n++;  //j = 2, n = 3
j = n++;  //j = 3, n = 4

我的问题是,为什么以下内容导致n = 1而非n = 3

n = 1;
n = n++;  //n = 1
n = n++;  //n = 1
n = n++;  //n = 1

如果代码是以n++n)的预增量完成的,则结果为n = 4,这是预期的。我知道第二个代码段永远不应该像第一个那样完成,但它是我遇到的东西,我很好奇它为什么会这样。

请告知。

3 个答案:

答案 0 :(得分:10)

您的第二个示例是不允许的,并且具有未定义的行为。 如果你需要这样的东西,你应该使用一个临时变量。但很难你需要这样的东西。

引用Wikipedia

  

由于递增/递减运算符修改其操作数,因此使用   这样的操作数不止一次在同一个表达式中就可以产生   未定义的结果。例如,在诸如x - ++ x的表达式中,它是   不清楚减法和增量运算符的顺序   应该执行。这样的情况甚至更糟   编译器应用优化,这可能导致   操作的执行顺序不同于   程序员打算。

答案 1 :(得分:3)

C ++ 11标准的其他示例包括:

i = v[i++]; // the behavior is undefined
i = 7, i++, i++; // i becomes 9
i = i++ + 1; // the behavior is undefined
i = i + 1; // the value of i is incremented
f(i = -1, i = -1); // the behavior is undefined

答案 2 :(得分:1)

其他答案正确解释了此代码导致未定义的行为。您可能会对您在编译器中看到的行为的原因感兴趣。

就大多数编译器而言,x = n++这个表达式将被编译成以下基本指令:

  1. 取n的副本,称之为n_copy;
  2. 将1添加到n
  3. 将n_copy指定给x
  4. 因此表达式n = n++变为:

    1. 取n的副本,称之为n_copy;
    2. 将1添加到n
    3. 将n_copy指定为n
    4. 这在逻辑上等同于:

      1. 将n分配给n
      2. 这在逻辑上等同于:

        1. 什么也不做。
        2. 这就是为什么在你的情况下你会看到n == 1.并非所有编译器都必须产生相同的答案。