之前发过一篇博客,写的是关于一条语句输出回文值,在发那篇博客的时候并没有看懂那条语句的执行过程,现在补充道这里。
原来那篇博客的地址是: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; }