| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2462 人关注过本帖
标题:此程序的执行顺序是什么
只看楼主 加入收藏
young
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:223
专家分:160
注 册:2004-9-5
收藏
得分:0 

楼主你使用断点调试,看它一步步是怎么执行的,还有使用call stack功能看看压入榨里面的函数不就清楚了么!


如果你爱C语言,请你爱指针; 如果你爱指针,请你爱指针的指针;
2006-06-30 16:17
一叶知秋
Rank: 1
等 级:新手上路
帖 子:100
专家分:0
注 册:2006-6-3
收藏
得分:0 
以下是引用–★–在2006-6-30 11:58:59的发言:
那么
if((*ch)=='\0')return;
这个语句的作用是什么?
粗暴地删掉它会导致什么现象?

是不是递归返回的起点?如果粗暴地删掉它是不是递归永无回头之时?
俺也是初学,请别见笑!

2006-06-30 21:44
han2y
Rank: 1
来 自:山东德州
等 级:新手上路
帖 子:175
专家分:0
注 册:2006-5-4
收藏
得分:0 
以下是引用–★–在2006-6-30 11:58:59的发言:
那么
if((*ch)=='\0')return;
这个语句的作用是什么?
粗暴地删掉它会导致什么现象?

死循环


2006-07-01 01:48
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
12、13楼都对,12楼的表述更好。下面再出两道与递归有关的思考题
[题目1]怎样做才能弄清某递归函数(例如put)总共被调用了多少次?
[题目2]怎样做才能弄清递归函数(例如put)每次调用时的递归深度?
void put(char *ch)
{
if((*ch)=='\0')return;
put(ch+1);
printf("%c",*ch);
}


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-07-01 08:51
han2y
Rank: 1
来 自:山东德州
等 级:新手上路
帖 子:175
专家分:0
注 册:2006-5-4
收藏
得分:0 
1.put(char *ch,int k)
{if(*ch=='\0')return;

put(ch+1,k++);
printf("%c%d",*ch,k);
}

[此贴子已经被作者于2006-7-1 9:53:27编辑过]


2006-07-01 09:24
lxs5216
Rank: 1
等 级:新手上路
帖 子:144
专家分:0
注 册:2006-2-3
收藏
得分:0 
请问二楼:

8。现在遇见隐含的“return”

隐含的return是哪里搞出来的?不会是因为有函数就会隐含有return吧???
2006-07-01 13:24
lxs5216
Rank: 1
等 级:新手上路
帖 子:144
专家分:0
注 册:2006-2-3
收藏
得分:0 
以下是引用–★–在2006-6-30 5:18:20的发言:
2:15:24还在学习!难怪问这么。。。MY GOD!
当你递归遇阻时,请首先降低递归深度
put(char *ch)
{ if(*ch=='\0')return;
put(ch+1);
printf("%c",*ch);
}
main()
{ char CH[]="ab";//俺先处理2个有效字符,看看行不行
put(CH);//将CH[0]的地址传送给put()的形参ch
printf("\n");
}

下面是执行情况:
1。if()条件不满足,因为此时(*ch)=='a'
2。二度调用put(ch+1),将CH[1]的地址传送给put()的形参ch
3。if()条件不满足,因为此时(*ch)=='b'
4。三度调用put(ch+1),将CH[2]的地址传送给put()的形参ch
5。if()条件成立,因为此时(*ch)==CH[2]=='\0'
6。于是“return”返回到哪里?这是初学者最迷惑不解的
7。返回到(因三度调用导致的)二度调用断点处。因而执行:
printf("%c",*ch);注意:输出一个'b'而不是'a'
8。现在遇见隐含的“return”返回到哪里?又是初学者困惑的
9。返回到(因二度调用导致的)初次调用断点处。因而执行:
printf("%c",*ch);注意:此时输出'a'
10.又遇见隐含的“return”返回到哪里?又犯难了不是
11.返回到(因初次调用导致的)main()断点处。因而执行:
printf("\n");
12.此时遇见main()末尾隐含的“return”返回到哪里?
13.返回到当初启动main()运作的那个家伙手里

注意递归深度、关注返回哪里。
既要低头拉车、也得抬头问路。

请告诉我8和10中隐含的return是怎么来的??怎么以前看的教材中没有提到有隐含的return呢!!

2006-07-01 14:32
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
void型函数体的末尾,有1条隐含的return语句。
例如下面两个东东是等价的:

void put(char *ch)
{ if(*ch=='\0')return;
put(ch+1);
printf("%c",*ch);
}

put(char *ch)
{ if(*ch=='\0')return;
put(ch+1);
printf("%c",*ch);
return;
}


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-07-01 14:44
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 

#include <stdio.h>
int times=0; //记录put()被调次数(含递归调用)
void put(char *ch,int k)//k记录当前递归深度
{
times++;
if(*ch=='\0')return;
put(ch+1,++k);
printf("%c%d",*ch,k);
}
main()
{
char ch[]="abcdef";
put(ch,0);
printf("\n%d\n",times);
}

//VC下运行实况

f6e5d4c3b2a1
7
Press any key to continue


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-07-01 15:14
快速回复:此程序的执行顺序是什么
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.134435 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved