这道C程序题如何解释?(50分)

  • 主题发起人 张利中
  • 开始时间

张利中

Unregistered / Unconfirmed
GUEST, unregistred user!
fun(int k)
{
if(k>0)
fun(k-1);
printf(" %d ",k);
}
main()
{
int w=5;
clrscr();
fun(w);
}
这道题输出结果是0 1 2 3 4 5, 应如何解释??
 
fun(int k)
这是递归程序啊!
if(k>0) 他就调用自身 fun(k-1);
注意此时参数减1
直到k=0为止终止递归返回主函数!
所以会 输出结果是0 1 2 3 4 5 !
[:D][:D]
 
同意楼上,递归程序,输出结果是由底层往外走的
 
这是递归,一般的C语言教材里都有讲的呀。
建议看看书[:)]
 
先清屏,然后递归。
注意显示的是:0 1 2 3 4 5 是个小技巧。
 
就是递归吗.
 
if(k>0)
fun(k-1);
是一句表只要k>0就循环,那么k从5-1,4-1,3-,2-1,1-1时k=0,不执行fun(k-1了)
接着就执行fun(k),那么输出k就是0.
前面每执行一次fun(k)就输出k所以k从5-1,4-1,3-,2-1,1-1时输出:5,4,3,2,1
由于递归程序输出结果是由底往高所以这样0,1,2,3,4,5
 
最简单的递归程序
 
各位都明白,但是讲解的 不够透彻,模糊.
哪位能说得清楚一些
 
是啊,这是递归,不明白的话,程序跟踪执行一下不就明白了?
嘿,李衍智,你是C++ Builder的斑竹啊,我问你个问题:
遇到下面这个怪问题,好像Tc有点怪。
void main()
{
int i,j;
i=3;
j=(++i)+(++i)+(++i);
printf("%d/n",j);//在Tc2中运行的结果:18,Vc++6中运行的结果:16
i=3;
printf("%d/n",(++i)+(++i)+(++i));//在Tc2中运行的结果:15,Vc++6中运行的结果:16
i=3;
j=(i++)+(i++)+(i++);
printf("%d/n",j);//在Tc2中运行的结果:9,Vc++6中运行的结果:9
i=3;
printf("%d/n",(i++)+(i++)+(i++));//在Tc2中运行的结果:12,Vc++6中运行的结果:9
}
 
就是你拿着一面小镜子对着一面大镜子,想想吧
 
那是每个C编译器对++操作符的解释不同而已,没必要去钻这种牛角尖,基本上教材上
都会提醒你不要采用类似的代码,以免发生不可预见的错误。
 
to wddelphi:
首先不要象你那样编程序,可读性不说,也会发生错误。
出现不同的结果的原因应该是编译方法问题。
毕业很多年了,想不起来了,好像是先进先出?后进现出?总之编译原理有两种处理的方法。
你去查一下吧。
 
多谢了,教父、李衍智,我是在学习,照着书上的例子写的,因为在VC和TC上运行结果不同,
更奇怪的是TC中(i++)+(i++)+(i++)放在printf和j=(i++)+(i++)+(i++))中的结果都不同,
才想来问一下,编程中是不会用这样的写法的。
对了,李衍智,你是C++ Builder的斑竹,我想我大概不会去用C++ Builder,那么VC和C++ Builder
有很大区别吗?都是C++,可用人单位招的都是VC,Delphi的也不少,可就没见招C++ Builder的,
真是奇怪。
 
wddelphi:
你好象说错话了,呵呵。
vc与c++builder区别很大。
1、如果你是初学者,学bcb会很容易上手。
2、学bcb与学delphi都容易犯一个毛病,很多问题不求甚解。学vc不会这样。但这是人的问题。
不是语言的问题。不要怨bcb与delphi惯你。
3、想学c++,那就学vc,不过很难的,正常需半年时间才能基本掌握。
4、想快速开发程序,出成绩,学bcb吧。
 
其实就我个人认为,做为一个开发人员要对自己的代码负责,而象wddelphi所提供的这种
代码写出来之后过一段时间你自己都很难明白是什么意思。更何况别人看呢。
编写代码的时候最好不要玩什么这样的技巧,否则到最后只能是害了你自己。
另外关于wddelphi所提到的那个问题,由在91年出版的国内经典著作《C程序设计》当中就
已经提到过不同的编译器对此代码的编译结果不一样了。
 
if(k>0)
fun(k-1);
是一句表只要k>0就循环,那么k从5-1,4-1,3-,2-1,1-1时k=0,不执行fun(k-1了)
接着就执行fun(k),那么输出k就是0.
前面每执行一次fun(k)就输出k所以k从5-1,4-1,3-,2-1,1-1时输出:5,4,3,2,1
由于递归程序输出结果是由底往高所以这样0,1,2,3,4,5
楼上:
讲的非常对,可以从堆栈的方面考虑也就可以了!
 
本题应从堆栈角度考虑:
先是进栈:
f(5)->f(4),5->f(3),4->f(2),3->f(1),2->f(0),1->0
然后输出:从上到下(上面是从右到左)0,1,2,3,4,5
总之是从堆栈角度考虑.
 
基础阿基础
 
顶部