返回信息流☆─────────────────────────────────────☆
tingyang (奔跑中的肉夹馍) 于 (Tue Mar 22 23:23:16 2011) 提到:
void f(int n)
{
printf("%d\n",n);
n/(1000-n);
f(n+1);
}
调用: f(0)输出一串数字。这个函数为什么更够运行呢?n/(1000-n)结果为什么的时候退出呢?
☆─────────────────────────────────────☆
fentoyal (长风长歌) 于 (Wed Mar 23 07:58:37 2011) 提到:
【 在 tingyang 的大作中提到: 】
: void f(int n)
: {
: printf("%d\n",n);
: ...................
能运行因为他没任何语法错误。
但是跑起来就停不住了。。
而且,那句n/(1000-n)没有任何意义,因为没有赋值。
*****************************************************************
爬了下楼,看见楼下有说因为除0异常停止的。这是不对的,因为C++标准不认为除0异常,也不进行捕获,更谈不上除0异常退出。
所以理论上这是死循环。
会停下(其实是报错abort),因为用的是递归,每次递归调用,函数是要压栈的,返回地址,ebp,参数,等等根据系统不同,压栈的东西多少不一。所以递归一段时间就栈溢出了。
然后就abort了。
如果做成循环
void f(int n)
{
while( ++n)
{
printf("%d\n",n);
n/(1000-n);
}
// f(n+1);
}
就不会停了。
☆─────────────────────────────────────☆
houxh912 (sniffer) 于 (Wed Mar 23 08:17:32 2011) 提到:
n=1000的时候,发生除0异常,递归就结束了,开始返回~~~
☆─────────────────────────────────────☆
iam19891211 (【洛阳亲友如相问】 【就说我在学六楼】) 于 (Wed Mar 23 08:45:06 2011) 提到:
赞
☆─────────────────────────────────────☆
gootyking (『热情一顶乐团』团长|回帖终结者A1) 于 (Wed Mar 23 08:58:10 2011) 提到:
恩
【 在 houxh912 (sniffer) 的大作中提到: 】
: n=1000的时候,发生除0异常,递归就结束了,开始返回~~~
☆─────────────────────────────────────☆
iam19891211 (【洛阳亲友如相问】 【就说我在学六楼】) 于 (Wed Mar 23 09:09:40 2011) 提到:
在机器上跑出来的返回值有点看不懂啊,求指点
【 在 houxh912 的大作中提到: 】
: n=1000的时候,发生除0异常,递归就结束了,开始返回~~~
: --
☆─────────────────────────────────────☆
shisiyuan (unbelievable) 于 (Wed Mar 23 09:10:35 2011) 提到:
赞
☆─────────────────────────────────────☆
Bogdanfan (bogdan) 于 (Wed Mar 23 09:22:14 2011) 提到:
en n/n-1000就是结束条件
☆─────────────────────────────────────☆
xinguohenan (小水) 于 (Wed Mar 23 09:27:15 2011) 提到:
十大一定
☆─────────────────────────────────────☆
gootyking (『热情一顶乐团』团长|回帖终结者A1) 于 (Wed Mar 23 09:29:31 2011) 提到:
十大了哇
【 在 xinguohenan (小水) 的大作中提到: 】
: 十大一定
☆─────────────────────────────────────☆
icepig (我不是ICEPIG) 于 (Wed Mar 23 09:31:54 2011) 提到:
泪目啊 看到C/C++版十大
☆─────────────────────────────────────☆
littlefly (小苍) 于 (Wed Mar 23 09:32:17 2011) 提到:
不知道lz是什么环境,如果是unix like的系统的话,除以0进程会收到一个表示浮点运算错误的信号SIGFPE ,如果没有对此信号进行捕获的话,程序对此信号的处理一般是直接结束而不是返回,并生成core文件,你可以在一个程序里调用一下,然后再在调用后面随便打印点东西,看这个东西是不是会被打印出来,以验证是函数返回还是程序退出
☆─────────────────────────────────────☆
Bogdanfan (bogdan) 于 (Wed Mar 23 09:32:29 2011) 提到:
哇哇哇 十大十大
☆─────────────────────────────────────☆
tingyang (奔跑中的肉夹馍) 于 (Wed Mar 23 09:38:09 2011) 提到:
能停止啊!调用f(0)的话就输出到4720就结束了。你运行的结果不是这样么?
【 在 fentoyal 的大作中提到: 】
: : void f(int n)
: : {
: : printf("%d\n",n);
: ...................
☆─────────────────────────────────────☆
shenlei (我爱果子|[路]|天山南北|潇湘隐士) 于 (Wed Mar 23 09:38:57 2011) 提到:
那啥,咋每天早上都能上个10呢...浮云啊...
☆─────────────────────────────────────☆
tingyang (奔跑中的肉夹馍) 于 (Wed Mar 23 09:48:43 2011) 提到:
程序运行4720次,然后直接退出而不是返回
【 在 littlefly 的大作中提到: 】
: 不知道lz是什么环境,如果是unix like的系统的话,除以0进程会收到一个表示浮点运算错误的信号SIGFPE ,如果没有对此信号进行捕获的话,程序对此信号的处理一般是直接结束而不是返回,并生成core文件,你可以在一个程序里调用一下,然后再在调用后面随便打印点东西,看这个东西是不是会被打印出来,以验证是函数返回还是程序退出
: --
☆─────────────────────────────────────☆
iam19891211 (【洛阳亲友如相问】 【就说我在学六楼】) 于 (Wed Mar 23 09:52:18 2011) 提到:
如果N=1000时溢出,那输出不是应该是0到1000么。。。为啥我的不是呢,有没有人指点一下啊
在程序调用后的打印命令不会被执行,所以是程序退出而不是函数返回
把n/n-1000注释掉之后,发现程序仍然能够结束,而且是程序退出而不是函数返回
所以,个人猜测导致这个递归结束的原因是堆栈段溢出而不是除零溢出吧
☆─────────────────────────────────────☆
lixunhuan (李寻欢) 于 (Wed Mar 23 10:07:33 2011) 提到:
估计涉及到C++对于除零 异常的处理.
在 debug版本下测试是会运行到某一个数值比如5712 左右推出.
但是在release 版本中到了 2W+依然没有出错..
【 在 iam19891211 的大作中提到: 】
: 如果N=1000时溢出,那输出不是应该是0到1000么。。。为啥我的不是呢,有没有人指点一下啊
: 在程序调用后的打印命令不会被执行,所以是程序退出而不是函数返回
: 把n/n-1000注释掉之后,发现程序仍然能够结束,而且是程序退出而不是函数返回
: ...................
☆─────────────────────────────────────☆
txmm (你被tx啦!) 于 (Wed Mar 23 10:10:43 2011) 提到:
十大?太虎了把
☆─────────────────────────────────────☆
froglian (青蛙连) 于 (Wed Mar 23 10:22:49 2011) 提到:
十大啊……泪奔啊……
☆─────────────────────────────────────☆
stfairy (大真似伪、大爱无疆的小楼主) 于 (Wed Mar 23 10:27:32 2011) 提到:
【 在 iam19891211 的大作中提到: 】
: 如果N=1000时溢出,那输出不是应该是0到1000么。。。为啥我的不是呢,有没有人指点一下啊
: 在程序调用后的打印命令不会被执行,所以是程序退出而不是函数返回
: 把n/n-1000注释掉之后,发现程序仍然能够结束,而且是程序退出而不是函数返回
: ...................
re,这个ms靠谱
☆─────────────────────────────────────☆
coolfantasy (Cool) 于 (Wed Mar 23 10:41:22 2011) 提到:
编译器如果做了尾递归优化,还真有可能不会栈溢出
有除零的风险
☆─────────────────────────────────────☆
shuimu1027 (【绝望团的绝唱】||【水母倍儿sui???】) 于 (Wed Mar 23 11:08:31 2011) 提到:
没有赋值就没有向内存中存放数据,所以可以说“n/(1000-n)”没有执行
☆─────────────────────────────────────☆
liudq3888 (哥帅不) 于 (Wed Mar 23 11:17:36 2011) 提到:
【 在 shuimu1027 的大作中提到: 】
: 没有赋值就没有向内存中存放数据,所以可以说“n/(1000-n)”没有执行
: --
是这样的吗?
☆─────────────────────────────────────☆
dawnc (9527) 于 (Wed Mar 23 11:24:19 2011) 提到:
退出的原因是不是与程序栈空间的大小有关,一般程序默认栈空间是2MB,改一下这个大小,看退出时输出的数据是不是有变化。
☆─────────────────────────────────────☆
lenevo (legend) 于 (Wed Mar 23 11:25:43 2011) 提到:
十大
☆─────────────────────────────────────☆
b78859793 (neji) 于 (Wed Mar 23 11:47:44 2011) 提到:
这是很多年前看到的一个题目了。
不用判断循环输出1~1000个数,我当时在VC6下试过是输出到1000跳出来的啊- -
从0开始输入会有什么不同吗
☆─────────────────────────────────────☆
shuimu1027 (【绝望团的绝唱】||【水母倍儿sui???】) 于 (Wed Mar 23 12:41:11 2011) 提到:
一赋值就可以看到到一千报异常了
☆─────────────────────────────────────☆
suyulin (编个昵称好麻烦……) 于 (Wed Mar 23 18:00:15 2011) 提到:
C运行了一下发现是在堆栈溢出的时候出core
为什么没有在1000的时候core出是因为计算结果没有赋值,所以进行了优化,没有进行除法操作。
【 在 fentoyal (长风长歌) 的大作中提到: 】
: 能运行因为他没任何语法错误。
: 但是跑起来就停不住了。。
: 而且,那句n/(1000-n)没有任何意义,因为没有赋值。
: ...................
☆─────────────────────────────────────☆
icicle (凌次方) 于 (Wed Mar 23 18:42:10 2011) 提到:
赞~
【 在 iam19891211 的大作中提到: 】
: 如果N=1000时溢出,那输出不是应该是0到1000么。。。为啥我的不是呢,有没有人指点一下啊
: 在程序调用后的打印命令不会被执行,所以是程序退出而不是函数返回
: 把n/n-1000注释掉之后,发现程序仍然能够结束,而且是程序退出而不是函数返回
: ...................
☆─────────────────────────────────────☆
sniffer (猪) 于 (Wed Mar 23 18:56:33 2011) 提到:
优化 优化 优化
☆─────────────────────────────────────☆
Beatrix (Beatrix) 于 (Thu Mar 24 16:56:26 2011) 提到:
编译器会优化的,那句话没意义,编译后的程序就没那句话。
这是一条镜像帖。来源:北邮人论坛 / cpp / #50836同步于 2011/4/4
CPP机器人发帖
[合集] 求指点,递归函数结束条件
shenlei
2011/4/4镜像同步0 回复
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。