前段时间看到blog上争论一道C++面试题,觉得很有意思,也想来多说几句.
这道题同以下的雷同.
int i=0,k=0;
i=(i++)+(i++)+(i++);
k=(++k)+(++k)+(++k);
问最后i,k的值是多少?
我确信没有程序员会写这样的代码,除非他真的不想干了.所以这道题出来之后很多人都说变态,因为在不同的编译器下,居然有不同的结果!
不过这道题并非完全没有价值,其实质就是要考面试者对++运算符在前或在后的区别.先我们不管上面这道题结果是多少,刚开始显得有点复杂,我们不如从简单的开始:
int i=2,k=2,s=0;
s=i++; //结果s=2 ,i=3
s=++k; //结果s=3 ,k=3
s的结果相同吗?如果你以为是相同的,那你真得去复习下c++,答案是不同的.原因在哪里呢?
原来 i++是as the increment occurs after the expression is evaluated,就是在表达式赋值后才自加1的,
而++k是as the increment occurs before the expression is evaluated,就是在表达式符值前就自加1了.所以就有不同的值哦. 但i同k最后都等于了3.
搞清楚了这一点,再回过头来看起初的这道题,不管不同的编译器结果是什么,我们都值得来烟酒下这道题:
int i=0,k=0;
i=(i++)+(i++)+(i++);
由于自加发生在表达式赋值之后,所以我们分解如下:
int i=0,j;
j=(i++)+(i++)+(i++); //
cout<<"j="<<j<<endl;
cout<<"i="<<endl;
按照上面的理论,j的结果应该为0,但后来i的值在表达式赋值后又自加了三次,结果最终i的值应该为3.
同理,第二个++k可以如下理解:
int k=0;
k=(++k)+(++k)+(++k);
由于自加发生在表达式赋值之前,所以在表达式赋值给k的时候,k的值由1,2,3变成了最终的3,结果3个3相加,结果应该是9.
我不知道我讲得对不对,大家是否有不同的见解,欢迎拍砖.