一个表达式中出现多个自增自减运算符的求值问题

昨天想进一个群,被群主拒绝,理由是一道自增运算符的题目。虽然自己猜出的答案和编译结果一样,但是百度了一下,发现网上讲的有点模棱两可,于是在同事的指导下查看了汇编代码才解决了心头的疑惑。

首先先看一下三种运算表达式:

#include<iostream>
using namespace std;
int main()
{
	int i=2;
	cout<<i++*i++*i++<<endl;
	int j=3;
	cout<<j++*--j*--j<<endl;
	int k=5;
	cout<<++k+(++k)+(++k)<<endl;
	return 0;
}

以上代码在VC6.0上运行结果是:

8

4

22

在VS2005中运行结果是:

8

1

24


不能就这么被一句“与编译器相关”给打发了,于是查看了汇编,发现了原因。三个表达式我分别分成了五个部分,如图:


在VC6.0中编译顺序是

2 4 1 3 5

3 2 5 4 1

1 3 2 5 4

而在VS2005中编译顺序是这样的:

2 4 1 3 5

3 5 2 4 1

1 3 5 2 4

如果有人对以上运算依旧看不懂的话,我想你是应该要记住这样一句话了“前置操作符返回加1后的值,即返回对象本身;后置操作符返回未加1的值。”以及优先级顺序(从大到小)前置操作符、后置操作符、*/、+-


真正写代码的时候千万不可以这样写哦,否则就坑爹了。只有一些奇葩面试题才会遇到这样的情况。

好了,如果有什么不对的地方,请指正,我会尽快修改。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值