| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2462 人关注过本帖
标题:此程序的执行顺序是什么
只看楼主 加入收藏
han2y
Rank: 1
来 自:山东德州
等 级:新手上路
帖 子:175
专家分:0
注 册:2006-5-4
结帖率:100%
收藏
 问题点数:0 回复次数:18 
此程序的执行顺序是什么

main()
{ char ch[7]={"abcdef"};
put(ch);
printf("\n");
}

put(char *ch)
{
if((*ch)=='\0') return;

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

}
运行此程序的结果: fedcba
此程序的执行顺序是什么?按理说应该在执行完递归调用后只输出一个字符'F',为什么会全部输出数组的值呢?
哪位高手会解答……





搜索更多相关主题的帖子: 顺序 put char printf 
2006-06-30 02:15
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
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()运作的那个家伙手里

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


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-06-30 05:18
han2y
Rank: 1
来 自:山东德州
等 级:新手上路
帖 子:175
专家分:0
注 册:2006-5-4
收藏
得分:0 

把你的代码展开是这样: (虽然不能运行,但可说明问题)
void put(char *ch)
{
if((*ch)=='\0')
return;
put(ch+1)
{
if(*ch=='\0')
return;
put(ch+1)
{if(*ch=='\0')
return;
put(ch+1);
printf("%c",*ch);
}
printf("%c",*ch);
}
printf("%c",*ch);
}
main()
{ char ch[]={"ab"};
put(ch);
printf("\n");
}


2006-06-30 08:57
论坛
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1372
专家分:0
注 册:2006-3-27
收藏
得分:0 
digui digui

日出东方,唯我不败! 做任何东西都是耐得住寂寞,任何一个行业要有十年以上的积累才能成为专家
2006-06-30 09:31
han2y
Rank: 1
来 自:山东德州
等 级:新手上路
帖 子:175
专家分:0
注 册:2006-5-4
收藏
得分:0 

不知我解释的对不对


2006-06-30 11:05
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
只要符合2楼那个解释,就对了。
考考你自己:不给上机,说出
下面两个put()功能上的异同。
put(char *ch)
{
if((*ch)=='\0')return;
put(ch+1);
printf("%c",*ch);
}

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

落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-06-30 11:14
han2y
Rank: 1
来 自:山东德州
等 级:新手上路
帖 子:175
专家分:0
注 册:2006-5-4
收藏
得分:0 
前一个逆向输出,后正向输出(针对数组)

2006-06-30 11:54
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
那么
if((*ch)=='\0')return;
这个语句的作用是什么?
粗暴地删掉它会导致什么现象?

落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-06-30 11:58
jackey163
Rank: 1
等 级:新手上路
帖 子:230
专家分:0
注 册:2005-7-21
收藏
得分:0 
以下是引用–★–在2006-6-30 11:58:59的发言:
那么
if((*ch)=='\0')return;
这个语句的作用是什么?
粗暴地删掉它会导致什么现象?

char默认最后一个是\0
"abc" 是 a b c \0

顺便问下这里ch+1是什么意思,不是很懂
解释下,谢谢


.net 方面可以交流下 MSN:jackeyhuang123@
2006-06-30 15:30
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
以下是引用jackey163在2006-6-30 15:30:23的发言:

char默认最后一个是\0
"abc" 是 a b c \0

顺便问下这里ch+1是什么意思,不是很懂
解释下,谢谢

这里ch+1是&ch[1],具体就是串中“下一个”字符的“地址”也。


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



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

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