这是一个很古老的问题,在stackflow已经有十多年的记录,然而我还是小白白白白白白…
开始!!!小二,上代码!
得嘞!
情况1
#include <iostream>
using namespace std;
void main()
{
int x = 1;
int y;
for (int i = 0; i < 10; i++)
{
y = x++;
cout << "y:" << y << endl;
}
std::getchar();
}
运行结果为
y:1
y:2
y:3
y:4
y:5
y:6
y:7
y:8
y:9
y:10
对于y=x++;可以进行如下翻译:(先自增,后赋值)
int tmp = x; //第一次x原值为1
x = x + 1;
y = tmp; //第一次循环中y等于x的原值1(虽然此时x已经变为2)
以上不用分析,正常人都没有疑问。
情况2
那么请看下面这种情况
#include <iostream>
using namespace std;
void main()
{
int x = 1;
//int y;
for (int i = 0; i < 10; i++)
{
x = x++; // what???
cout << "x:" << x << endl;
}
std::getchar();
}
可能输出结果如下
x:1
x:1
x:1
x:1
x:1
x:1
x:1
x:1
x:1
x:1
那么他们的编译器可能这样翻译的(先自增,后赋值):
int tmp = x; // 第一次x原值为1
x = x + 1;
x = tmp; // x=1(赋值覆盖了自增运算),g++编译器好像就是这样的
情况3
情况2的代码也有可能输出如下结果:
x:2
x:3
x:4
x:5
x:6
x:7
x:8
x:9
x:10
x:11
那么他们的编译器可能这样翻译的(先赋值,后自增):
int tmp = x; //第一次x原值为1
x = tmp;
x = x + 1; // x=2
注:请款1和情况3是在VS2019的运行结果(有些矛盾哈,换了一个变量,逻辑就变了),那个情况2是在linux中用g++编译的结果。
我还有个疑问哈:x=x++; 这种表达式是否是有缺陷的表达式,在实际工程中是否应该避免使用那?
欢迎在评论区留言讨论,让更多小白白有点收获!
附上stacklow两条链接
https://stackoverflow.com/questions/7911776/what-is-x-after-x-x
https://stackoverflow.com/questions/3831341/why-does-this-go-into-an-infinite-loop
20231102更新:最近读C++ Primmer 4.5节递增递减运算符最后那里,“运算对象可按任何顺序求职”,如果这样解释那么这里是没有定义的,小伙伴们,这样理解没有错吧?欢迎评论。