后增量运算符如何工作。有例外吗?

Kes*_*arg 1 c++ undefined-behavior post-increment

考虑这段代码

int j = 0;
int x = 0;

for(int i=0;i<5;i++){
    j = x++;
    cout<<x<<" ";
}
Run Code Online (Sandbox Code Playgroud)

输出:

1 2 3 4 5

现在考虑这个

int j=0;

for(int i=0;i<5;i++){
    
    j = j++;
    cout<<j<<" "; 
}
Run Code Online (Sandbox Code Playgroud)

输出:

0 0 0 0 0

我的疑问是为什么j在分配 value 后没有增加0。不j=j++;等于j = j; j++;,如果不是,那么第一种情况会发生什么。我知道这是一个愚蠢的怀疑,但我自己无法弄清楚。

joh*_*ohn 5

是不是 j=j++; 相当于 j = j; j++;

不绝对不是,这是对前后增量运算符最常见的误解之一。

真正的等价物j = j++;

int temp = j;
++j;
j = temp;
Run Code Online (Sandbox Code Playgroud)

初学者认为后增量发生在其他一切之后。但事实并非如此。增量发生在取值之后,而不是在执行完语句的其余部分之后。你可以看到,在上面的代码,价值jtemp = j;,则增量发生++j;,则使用值j = temp;

正如多次说过的,这段代码只有在 C++17 中有定义的含义,在此之前它是未定义的。