| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付学习型 ASP/PHP/ASP.NET 主机 30元/年
高端软件开发 = 年薪十万不是梦赛孚耐:软件保护加密专家身份认证令牌USB KEY 
共有 750 人关注过本帖
标题:请教两道谭浩强书中习题
收藏  订阅  推荐  打印 
vivianna
Rank: 1
等级:新手上路
帖子:9
积分:190
注册:2004-5-15
请教两道谭浩强书中习题

1。以下程序的运行结果是?

int X1=30, X2=40;

main()

{int X3=10,X4=20;

sub(X3,X4);

sub(X2,X1);

printf("%d,%d,%d,%d\n",X3,X4,X1,X2 );

}

sub(intX,intY)

{

X1=X;

X=Y;

Y=X1;

}

答案是:10 20 40 40

我实在想不通,(难道是答案错了吗?)请会做者指点一下。

2。以下程序的运行结果是?

int i=0;

main()

{int i=5;

reset(i/2); printf("i=%d\n",i);

reset(i=i/2); printf("i=%d\n",i);

reset(i/2); printf("i=%d\n",i);

workover(i); printf("i=%d\n",i);

}

workover(int i)

{ i=(i%i)*((i*i)/(2*i)+4);

printf("i=%d\n",i);

return(i);

}

reset( int i)

{i=i<=2?5:0;

return(i);

}

答案是:

i=5

i=2

i=2

i=0

i=2

第二个i和第三个i为何为2呢?解释一下好吗?

搜索更多相关主题的帖子: 谭浩强  习题  int  sub  main  
2004-5-18 08:28
zff_ff
Rank: 2
等级:注册会员
帖子:147
积分:1570
注册:2004-5-12

答案是没有错的

建议你在去翻翻全局变量这一部分,这些题目都很简单自己完全可以弄明白的

而且效果要比我们告诉你来的好

特别是第二题你要明白函数里修改的是全局变量还是其他什么??

以及到底是什么在影响程序的输出???


偶是一只想要飞却忘了咋飞的菜鸟
2004-5-18 12:34
vivianna
Rank: 1
等级:新手上路
帖子:9
积分:190
注册:2004-5-15

也许你明白,但对于一个新手来说,实在是有难度的,我要是自已能看懂的话就不用辛辛苦苦打出来了,我才是想飞却忘了咋飞的菜鸟啊!!郁闷!!

2004-5-18 16:42
hu_sir
Rank: 3Rank: 3
等级:中级会员
帖子:208
积分:2230
注册:2004-4-29

1。以下程序的运行结果分析:

int X1=30, X2=40; //全局变量!

main()

{int X3=10,X4=20; //局部变量!

sub(X3,X4); //局部变量传递的是形参,不改变其直,调用完后还是X3=10,X4=20;

sub(X2,X1); //全局变量在全局范围内有效!调用时,先是X1=40;再是X2=40;再是X1=40;

printf("%d,%d,%d,%d\n",X3,X4,X1,X2 );

}

sub(intX,intY)

{

X1=X;

X=Y;

Y=X1;

}

所以答案是:10 20 40 40


============================== 欢迎交流!
2004-5-18 20:46
zff_ff
Rank: 2
等级:注册会员
帖子:147
积分:1570
注册:2004-5-12

/****2*****/

int i=0;

main()

{int i=5;

reset(i/2); printf("i=%d\n",i);

reset(i=i/2); printf("i=%d\n",i);

reset(i/2); printf("i=%d\n",i);/*这三个函数如楼上所说的那样不改变其值,但是要注意

第二个i=i/2这是赋值语句,在这里输出的都是main里的局部

变量i分别是i=5,i=2,i=2*/

workover(i);

rintf("i=%d\n",i); //这句输出也一样i=2

}

workover(int i)

{ i=(i%i)*((i*i)/(2*i)+4);

printf("i=%d\n",i); /*这里输出的是workover(int i)里的局部变量i,在本程序里

他的行参是2,实际上不管行是多少他的输出都是0*/

return(i);

}

reset( int i)

{i=i<=2?5:0;

return(i);

}

//说的有些混乱,如果还看不明白,那你就把两个函数变量名改改就会明白的

[此贴子已经被作者于2004-05-18 23:07:11编辑过]


偶是一只想要飞却忘了咋飞的菜鸟
2004-5-18 23:05
vivianna
Rank: 1
等级:新手上路
帖子:9
积分:190
注册:2004-5-15

非常感谢你,我看懂了,你写得通俗易懂,想不理解都难啊!!书上一个知识点说上一大篇,它说到重要处,我可能都错过了,所以看几遍也看不到精华,其实它考的就是一个知识点:局部变量调用后不改变其值。这题目出的啊。。。。哎,真不知说什么好。

2004-5-19 23:01
starcat
Rank: 1
等级:新手上路
帖子:1
积分:110
注册:2004-6-3

sub(X2,X1); //全局变量在全局范围内有效!调用时,先是X1=40;再是X2=40;再是X1=40

为什么调用先是x1是40

我是菜菜鸟请指教

2004-6-4 13:39
jianenghui
Rank: 1
等级:新手上路
帖子:15
积分:250
注册:2004-6-6

第1题主要因为被调用函数没有给主函数以返回值,则X2,X3,X4值不变,.而X1 作为全局变量,在sub函数里x1变为了40,相应的在主函数里值也应为40.

2004-6-6 12:20
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.052135 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved