以下增量后续结果如下:
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
,这是预期的。我知道第二个代码段永远不应该像第一个那样完成,但它是我遇到的东西,我很好奇它为什么会这样。
请告知。
答案 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++
这个表达式将被编译成以下基本指令:
因此表达式n = n++
变为:
这在逻辑上等同于:
这在逻辑上等同于:
这就是为什么在你的情况下你会看到n == 1.并非所有编译器都必须产生相同的答案。