昨天想进一个群,被群主拒绝,理由是一道自增运算符的题目。虽然自己猜出的答案和编译结果一样,但是百度了一下,发现网上讲的有点模棱两可,于是在同事的指导下查看了汇编代码才解决了心头的疑惑。
首先先看一下三种运算表达式:
#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的值。”以及优先级顺序(从大到小)前置操作符、后置操作符、*/、+-
真正写代码的时候千万不可以这样写哦,否则就坑爹了。只有一些奇葩面试题才会遇到这样的情况。
好了,如果有什么不对的地方,请指正,我会尽快修改。