#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)); } 哪位高手请帮我分析一下程序运行过程及结果? 谢谢 |
根据书上说:当函数结束时,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编辑过]
哦~原来你是问这个啊,我还以为你想让我帮你分析整个程序呢! 如果函数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 其实这两个语句并不是完全等价的,前者没有调用函数,自然在运算速度上要比后者快很多,这点也是大家在往后学习中应该注意到的。
哦~原来你是问这个啊,我还以为你想让我帮你分析整个程序呢! 如果函数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 其实这两个语句并不是完全等价的,前者没有调用函数,自然在运算速度上要比后者快很多,这点也是大家在往后学习中应该注意到的。
神啊,你这个是一派胡言!
好!那你用我这个(其实也是你写的)验证一下你的“定理”,
不过得花点小钱,谁让你钱比我多
[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]