关于x=x++;

这是一个很古老的问题,在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节递增递减运算符最后那里,“运算对象可按任何顺序求职”,如果这样解释那么这里是没有定义的,小伙伴们,这样理解没有错吧?欢迎评论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值