标题:[求助]小程序运行结果分析
只看楼主
wanyy1228
Rank: 1
等 级:新手上路
帖 子:52
专家分:0
注 册:2004-8-8
 问题点数:0 回复次数:33 
[求助]小程序运行结果分析

 

#include<stdio.h>

int a=12;

int g(int n)

{

a/=2;

return(a+n);

}

int f(int a)

{

static int b=0;

a/=(b+2);

b+=g(a);

}

main() { while(a>0)

printf("%d\n",f(a)); } 哪位高手请帮我分析一下程序运行过程及结果?

谢谢

搜索更多相关主题的帖子: int 结果 运行 
2004-08-10 14:19
wanyy1228
Rank: 1
等 级:新手上路
帖 子:52
专家分:0
注 册:2004-8-8
得分:0 

这里重点应该是f的返回值吧,该这么确定呀??谢谢!!!

版主救我啊!


2004-08-10 15:13
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
得分:0 

我分析是分析得下去,不过太麻烦了,不管怎么说都说不清楚,一句话:

只可意会,不可言传!

还有要注意一点: static int b=0; 用了static之后b的值将不会在每次执行f函数的时候都会被赋值0~~~这里才是重点,要注意,static int b=0 和 int b=0 的后面的作用是不一样的!


淘宝杜琨
2004-08-10 15:41
天使预备役
Rank: 2
等 级:论坛游民
威 望:3
帖 子:670
专家分:10
注 册:2004-4-6
得分:0 

根据书上说:当函数结束时,C释放存储局部变量和参数的堆栈空间,然后,C根据返回地址判断程序下一步执行的

指令。C从堆栈中移走返回值(栈是先进后出),并将地址放入IP寄存器中。

依意思应该是:先在主程序中(“f(a)"),压入堆栈参数a,也就是12。

在函数int f(int a);中没有局部变量所以没有压占,然后是函数int g(int n);

压入堆栈参数n也就是6,中间没有局部变量,因为后面有retrun (a+n);再压入堆栈结果为12,这样,

在主程序中会读取最上面的值,为12。(全是猜测,请更正!!!)

[此贴子已经被作者于2004-08-10 16:06:26编辑过]


差点把你忘了...
2004-08-10 16:03
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
得分:0 

分析什么?

f(a)根本无返回值!你printf()它干什么?有意义吗?


九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2004-08-10 19:16
buio
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2004-8-5
得分:0 
因该是IF(A)吧
2004-08-10 19:58
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
得分:0 

哦~原来你是问这个啊,我还以为你想让我帮你分析整个程序呢! 如果函数f()没有return,那么他就会搜索f()调用过的函数中有没有return,如果有,那么函数f()的值就是这个return返回的东西。 这个还算容易理解的吧(起码我自己是这样理解的,先不管我说的原理对不对,按照我的说法用肯定没错) 比如: int g(int b) { b++; return(b); } int f(int a) { a++; g(a); } main() { int a=1; printf("%d\n",f(a)); getch(); } 这样,当系统调用f()完后发现f()没有return,那么系统就会调用g()的retun 所以返回值是3 值得我们注意的是,往常很多运算大家看起来很平常,实际上他们都是一个函数,比如: b=b-2 b=b+2 等等 这些其实都是调用了函数的,这些函数都有return返回计算的值。 举个例子: int g(int b) { b++; return(b); } int f(int a) { int b=4; a++; g(a); b=b+2; } main() { int a=1; printf("%d\n",f(a)); getch(); } 这样一来由于f()中,在g()的后面出现了b=b+2; 实际上系统已经在b=b+2 中调用了一个函数去完成这个简单的+法运算,所以在g()后面又出了个return,那么系统就会以最后出现的return为准,返回6。 从这点扩展出去,我们可以看出b+=2 和b=b+2 其实这两个语句并不是完全等价的,前者没有调用函数,自然在运算速度上要比后者快很多,这点也是大家在往后学习中应该注意到的。


淘宝杜琨
2004-08-10 21:03
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
得分:0 
以下是引用神vLinux飘飘在2004-08-10 21:03:34的发言:

哦~原来你是问这个啊,我还以为你想让我帮你分析整个程序呢! 如果函数f()没有return,那么他就会搜索f()调用过的函数中有没有return,如果有,那么函数f()的值就是这个return返回的东西。 这个还算容易理解的吧(起码我自己是这样理解的,先不管我说的原理对不对,按照我的说法用肯定没错) 比如: int g(int b) { b++; return(b); } int f(int a) { a++; g(a); } main() { int a=1; printf("%d\n",f(a)); getch(); } 这样,当系统调用f()完后发现f()没有return,那么系统就会调用g()的retun 所以返回值是3 值得我们注意的是,往常很多运算大家看起来很平常,实际上他们都是一个函数,比如: b=b-2 b=b+2 等等 这些其实都是调用了函数的,这些函数都有return返回计算的值。 举个例子: int g(int b) { b++; return(b); } int f(int a) { int b=4; a++; g(a); b=b+2; } main() { int a=1; printf("%d\n",f(a)); getch(); } 这样一来由于f()中,在g()的后面出现了b=b+2; 实际上系统已经在b=b+2 中调用了一个函数去完成这个简单的+法运算,所以在g()后面又出了个return,那么系统就会以最后出现的return为准,返回6。 从这点扩展出去,我们可以看出b+=2 和b=b+2 其实这两个语句并不是完全等价的,前者没有调用函数,自然在运算速度上要比后者快很多,这点也是大家在往后学习中应该注意到的。

神啊,你这个是一派胡言!


九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2004-08-10 21:34
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
得分:0 
那你解释个好点的给我看看,反正我这样理解就是用得!

淘宝杜琨
2004-08-10 21:42
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
得分:0 

好!那你用我这个(其实也是你写的)验证一下你的“定理”,

不过得花点小钱,谁让你钱比我多

[UseMoney=100]int g(int b) { b++; return(b); }

int f(int a) { a++; g(a); printf("knocker=%d\n",a);//注意这里,Knoker更换成不同的试试,比如:OK,NO,神。。。。。 }

main() { int a=1; printf("%d\n",f(a));

getch(); } [/UseMoney]


九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2004-08-10 21:55



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-4099-1-1.html




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

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