一个有关main函数的有趣有关问题,看看有没有人能解释清楚
一个有关main函数的有趣问题,看看有没有人能解释清楚:代码如下:C/C++ code#include iostreamusing names
一个有关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判断