在一些面试题中,很多面试官会故意出一些很刁钻的题来考面试者。当面对这种问题时,不要慌,第一个出口的答案必须是,虽然这些看起来技巧性很高的代码对我们理解语言与编译器的本质很有用途,但是实际开发过程中应该尽量避免高技巧性的写法,尽量做到通俗易懂,下面以我个人的见解对这道题的分析是:
譬如下面这些题:
1、请问:
#include <IOSTREAM> using namespace std; int main() { int i = 10; i = (i++) + (i++) + (++i); cout << i <<endl; return 0; }
输出的i的结果会是多少?
答案是:
好,下面我们来进行简单的分析(如果你实在看不懂下边的汇编源码,万不得已可以记住这个定律)
无论如何i++总是在一条语句中直接取i进行运算,等语句执行完再执行自加;就譬如j=i++一样可以拆成j=i和i=i+1;
我们总是会把i代入给j等到语句结束后后面再执行i=i+1;
而在一道表达式里++i总是在任何一个执行到他的语句的前一时刻执行,我们讲得生动点就是,你先在这稍等一下,让我++i执行完了再来告诉你继续执行
好了,有了上面2个分析点,我们来分析一下i = (i++) + (i++) + (++i);
此时是这样的情况 “ i = i + i ...你得稍等一下我++i执行完再来告诉你 "
此时执行i=i+1,执行完此时i就是11;但是由于之前i已经是10了,所以等号右边前2个i是10,第3个i是11;所以i = 10 + 10 + 11 = 31 ,有同学就说,咦,不对啊,答案是33,哈哈,其实你是忘了我们的i++,要等这个赋值语句执行完了,再执行2次自加,而此时i已经是31了,自加2次自然就是33了。
有兴趣的朋友可以用上面的方法研究一下i =
(++i)+(i++) + (i++) ;
今晚实在太困了,明天再剖析i++与++i的汇编源码。
本文由Cout_Sev 撰写。
若有错误欢迎指正
转载请注明出处:http://blog.csdn.net/cout_sev/
谢谢合作!
在一道表达式里++i总是在任何一个执行到他的语句的前一时刻执行,