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

Scorpiour 2012-06-05 09:53:35
代码如下:

#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
请按任意键继续. . .


问题:

为什么
...全文
302 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
Scorpiour 2012-06-10
  • 打赏
  • 举报
回复
恩,明白了,ok,结贴给分~
hstaber 2012-06-10
  • 打赏
  • 举报
回复
因为每次调用main函数,while只判断一次,第二次就不符合了,相当于用if判断
Scorpiour 2012-06-09
  • 打赏
  • 举报
回复
while的部分能理解了……但是用if为什么也是10呢……明明没有循环。
zcs201093189 2012-06-06
  • 打赏
  • 举报
回复
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继而返回。
……
Scorpiour 2012-06-06
  • 打赏
  • 举报
回复
我还是没有太明白。

如果说while是因为循环10次而main函数一直都没有返回的话

那么if为什么依然会得出10而不是1的结果呢?
hondely 2012-06-05
  • 打赏
  • 举报
回复
隐约懂了一点
赵4老师 2012-06-05
  • 打赏
  • 举报
回复
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出
ri_aje 2012-06-05
  • 打赏
  • 举报
回复
典型的 undefined behavior,有啥好解释的。
cbzjzsb123 2012-06-05
  • 打赏
  • 举报
回复
我真是比唐僧还啰嗦。。。
zhengjiankang 2012-06-05
  • 打赏
  • 举报
回复
我真是比唐僧还啰嗦。。。
zhengjiankang 2012-06-05
  • 打赏
  • 举报
回复
单步调试就可以知道结果了。
从第一次递归调用说起。
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值。
villypugang 2012-06-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
这个跟main函数没关系,有static变量的递归调用而已,
在vs系列里面单步一下就知道为啥了,没啥复杂的
[/Quote]


那为什么当i=10时循环体内还是会继续执行呢?不解
nice_cxf 2012-06-05
  • 打赏
  • 举报
回复
这个跟main函数没关系,有static变量的递归调用而已,
在vs系列里面单步一下就知道为啥了,没啥复杂的
iamnobody 2012-06-05
  • 打赏
  • 举报
回复
Scorpiour 2012-06-05
  • 打赏
  • 举报
回复
咦……好像没发上来……恩重新写下:

代码中将while改成if后,输出未变
Scorpiour 2012-06-05
  • 打赏
  • 举报
回复
问题后续:

代码修改后


int main()
{
static int i=0;

if(i<10)
{
++i+=main();
}

cout<<i<<endl;

return i;
}


输出无变化。
qq120848369 2012-06-05
  • 打赏
  • 举报
回复
这种贴可以结了,别占版面了。
lv_foxx 2012-06-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

单步调试就可以知道结果了。
从第一次递归调用说起。
i初始为0.
自增到1然后调用main
进入到while循环 i<10 成立
继续自增到2调用main
如此。。。
知道i=10不再调用。
于是最后一次调用的main里面i=10.
返回到到处第二次调用的main函数
此时++i的i=10;+= main的返回值10.
i等于20了。
跳出循环。
打印出20继而返回。
……
[/Quote]
将while换成if后,同上。
Scorpiour 2012-06-05
  • 打赏
  • 举报
回复
那么为什么把while换成if之后,其结果依然不变呢……?

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧