读书人

一个有关main函数的有趣有关问题看看

发布时间: 2012-06-11 17:42:22 作者: rapoo

一个有关main函数的有趣问题,看看有没有人能解释清楚:
代码如下:

C/C++ code
#include <iostream>using namespace std;int main(){    static int i=0;        while(i<10)    {        ++i+=main();    }        cout<<i<<endl;    system("pause");        return i;}


编译器:GCC

运行结果:


10
请按任意键继续. . .
20
请按任意键继续. . .
40
请按任意键继续. . .
80
请按任意键继续. . .
160
请按任意键继续. . .
320
请按任意键继续. . .
640
请按任意键继续. . .
1280
请按任意键继续. . .
2560
请按任意键继续. . .
5120
请按任意键继续. . .
10240
请按任意键继续. . .


问题:

为什么

[解决办法]
这个跟main函数没关系,有static变量的递归调用而已,
在vs系列里面单步一下就知道为啥了,没啥复杂的
[解决办法]
单步调试就可以知道结果了。
从第一次递归调用说起。
i初始为0.
自增到1然后调用main
进入到while循环 i<10 成立
继续自增到2调用main
如此。。。
知道i=10不再调用。
于是最后一次调用的main里面i=10.
返回到到处第二次调用的main函数
此时++i的i=10;+= main的返回值10.
i等于20了。
跳出循环。
打印出20继而返回。
继续操作。。。。
也就是说。
++i+=main()操作的main一直没有返回。
导致++i做了10次操作。
然后跳出循环之后打印出计算出来的i值。
[解决办法]
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出

[解决办法]
satic int i = 0;
i初始为0.
自增到1然后调用main
进入到while循环 i<10 成立
继续自增到2调用main
如此。。。
知道i=10不再调用。
于是最后一次调用的main里面i=10.
返回到到处第二次调用的main函数
此时++i的i=10;+= main的返回值10.
i等于20了。
跳出循环。
打印出20继而返回。
……

[解决办法]
因为每次调用main函数,while只判断一次,第二次就不符合了,相当于用if判断

读书人网 >C++

热点推荐