之前發過一篇博客,寫的是關於一條語句輸出迴文值,在發那篇博客的時候並沒有看懂那條語句的執行過程,現在補充道這裏。
原來那篇博客的地址是:http://blog.csdn.net/jianzhibeihang/archive/2009/12/06/4952037.aspx
今天特定在c版發了貼問了下,發現了很多好的回帖。版裏的大牛還是很多啊!
原帖地址爲:http://topic.csdn.net/u/20091209/10/d7cc1cc3-3eff-43d2-8096-c66a78996b3d.html#replyachor
首先解釋下,這條語句的執行過程,以p(1,3)爲例:
printf語句返回輸出的字符個數,由於有/n,所以printf執行始終爲真
第一層:p(1,3):printf執行爲真 輸出:1
3>1執行爲真 接下來會執行p(2,3)或p(1,1)
p(2,3) 或者 p(1,1)
第二層:p(2,3):printf執行爲真 輸出:2
3>2執行爲真 接下來會執行p(3,3)或p(2,2)
p(3,3)或者p(2,2)
第三層:p(3,3):printf執行爲真 輸出:3
3>3執行爲假 p(3,3)執行爲假,返回到第二層執行p(2,2)
因爲對於||操作符,||操作左邊的表達式爲假
則執行右邊的表達式,所以執行p(2,2)
返回到第二層p(2,2):printf執行爲真 輸出:2
2>2爲假 p(2,2)執行爲假,那麼整個p(2,3)的執行就爲
假,所以對於第一層p(2,3)||p(1,1),||表達
式左邊爲假,則執行||右邊的表達式,即p(1,1)
返回到第一層p(1,1):printf執行爲真 輸出:1
1>1執行爲假
最終p函數返回FALSE,執行結束.
下面是對return一句的轉化:
int p(int i, int N) { printf("%d/n", i); if (N>i) { if (p(i+1,N)==0) return p(i,i); else return 1; } else return 0; }