使用GCC4。5编译后,代码的执行结果如下:
construct 10
construct 6
operator ++(post) 6
copy construct 6
operator ++(post) 10
copy construct 10
operator +
construct 18
sum:18 a:10 b:6
desconstruct 18
desconstruct 10
desconstruct 6
desconstruct 7
desconstruct 11
我们来简单分析下这个执行过程:
construct 10
construct 6 //这两行输出对应于 X a(10),b(6);
operator ++(post) 6
copy construct 6 //表明首先执行了 cout<<"sum:" < b++这个表达式返回了一个值为6的临时对象,而b本身则变成了7。
operator ++(post) 10
copy construct 10 //这句的分析同上
operator +
construct 18 //对应于表达式 a+b ,可以看到,此时的a和b已经变成了11和7。表达式返回了一个值为18的临时对象。
sum:18 a:10 b:6 //输出的结果,从结果可以看出,实际上打印出的值分别为 a+b,a++和b++三个表达式所返回的临时变量。
desconstruct 18 //a+b 表达式返回的临时变量的析构
desconstruct 10 //a++ 表达式返回的临时变量的析构
desconstruct 6 //b++表达式返回的临时变量的析构
desconstruct 7 //变量a 的析构
desconstruct 11 //变量b的析构
真相大白了。为什么编译器会这样来编译这个表达式呢?
下面2楼的夜风同学给出了正确答案。。为了不误导后面的同学,特此编辑掉。。
上述实验的环境均为GCC4。5 据同学说VS2010执行的结果在DEBUG下和RELEASE下居然分别为:16 10 6 和18 10 6,不过我没有去验证过,有兴趣的同学可以去验证并分析一下。
做这样一道题还是让我收获很多,巩固了C++的基础。
今天就写道这里,后面有时间会陆续放出对其他“陷阱”题目的分析。
(未完待续)