| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2562 人关注过本帖
标题:为什么是这个结果?谁来帮我解释一下:
只看楼主 加入收藏
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
另外, printf("%f\n"……) ,怎么会出现 nan 的结果?
2009-11-30 17:24
tdy1006
Rank: 4
等 级:业余侠客
帖 子:173
专家分:240
注 册:2009-5-13
收藏
得分:0 
原来printf()也有返回值,
two_ten(a+1);
printf("-----%d----\n",j);
谁放后面就返回谁
???
2009-11-30 17:35
m456m654
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:3
帖 子:783
专家分:2806
注 册:2009-9-17
收藏
得分:0 
改为float型后,我的直接运行不出结果。只能看到printf的内容,但是return的内容是floating point erro Domain
也没改好~
2009-11-30 17:43
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
改为 float 型,最后输出的字符为  "  nan  "。
2009-11-30 18:28
lijm1989
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:珠海
等 级:贵宾
威 望:12
帖 子:675
专家分:2844
注 册:2009-10-14
收藏
得分:20 
1.我觉得还是调用函数时的压栈问题。。函数调用的时候会创建堆栈来传递参数和访问局部变量等,当函数运行完后很多局部的变量什么都会被销毁,而当这个函数有返回值的时候,在销毁之前,会把返回值的地址压入栈中,然后把变量的值赋给该地址,然后回到上一个函数中,将栈中的变量弹出赋给对应的值。。。
 2. 因为版主的子函数不是每个路径都存在着返回值。。而那个函数又是有返回值的函数。。。这时候就会遇到问题了。。
       加上版主用的是函数的递归调用。。也就只有最里面的那次函数调用有一个返回值 1234。。而到了最外层函数的时候,运行到最后时有一个printf函数。。因为printf函数是有返回值的。。如一开始所说,它会创建一个栈来储存返回值的地址。。接着便是two_ten函数销毁,虽然two_ten函数本身应该是有返回值的,但因为2(见上面的2)的原因最后没有return值,而返回到主函数的时候,又有 n = two_ten(a), 这条语句就很自然地让编译器从函数返回值创建的栈中找。。因为上述原因。。也就很自然地找到prtinf那个函数创建的栈中找到其返回值赋给 n,这就解释了为什么会输出 11.。。

然后m456m654版主说printf和递归语句two_ten(a+1);换下位置就好了。。这是因为printf函数是先执行。。最后执行的函数就是递归时最里层的那个return 1234,也就是这个函数唯一的一次返回值。。而返回到主函数的时候, n = two_ten(a), 编译器从函数返回值创建的栈中找。。便找到了 1234对应的那个栈。。于是非常正确地输出了 1234.。。

然后版主把函数返回值的类型换了。。换了之后后出现什么呢??因为 printf返回值是int 而two_ten返回值不是整型的话。。
继续看它们的执行情况。。。程序进入递归后就递归递归。。到最里面的时候。。有返回值 。。。创建一个栈。。压入值。。然后往外出去的时候不断的执行printf函数 。。。注意。。此时刚刚建的储存 那个最里层返回值的栈已经被销毁了。。然后到了递归的归外层。。执行最后 一个printf函数 。。将它输出的字符的个数(int型)压入创建好的栈中。。结束递归。。。又回到了主函数中。。执行n = two_ten(a),编译器从函数返回值创建的栈中找。。此时虽然存在一个储存返回值的栈。。但因为地址的类型不同(也可以说是储存的返回值的类型不同)。。不能读取。。但是也找不其它的栈了。。。。于是··输出找不到。。因为没有值。。
所以赋给 n 的也就是' nan'(not a number,不是一个数)  这个意思不同编译器有不同的表达方法。。大概就那个意思。。

                                 ------------------       个人薄见,有不对的地方海涵和指正
2009-11-30 20:18
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
回复 15楼 lijm1989
看下 9# 的程序,它的结果和我的程序的结果一样,你的这个解释我觉得用来解释 9# 的程序就有些牵强了。
2009-11-30 20:44
lijm1989
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:珠海
等 级:贵宾
威 望:12
帖 子:675
专家分:2844
注 册:2009-10-14
收藏
得分:10 
9#的

调用two_ten函数的时候会运行printf("-----\n");。。执行完printf函数的时候一个储存int型的地址压入栈中。。然后继续执行。。因为下面没代码可执行了。。虽没有返回值也没办法。。two_ten函数结束。。返回主函数的n=two_ten();因为two_ten函数返回的类型定为float ..与int的储存类型不同。--@--。执行n=two_ten();的时候编译器去栈中找不到对应的数。。于是返回 nan。。。
如果这个程序中的 two_ten函数的返回值是int类型的话。。执行n=two_ten();的时候编译器去找的时候就会找到printf函数创建的栈。。类型相同。。然后赋值··

我觉得的说的通啊··
2009-11-30 21:06
iFreeBSD
Rank: 4
等 级:业余侠客
威 望:4
帖 子:474
专家分:236
注 册:2007-11-5
收藏
得分:0 
我很纳闷,你为什么不用gdb调试呢?
收到的鲜花
  • 广陵绝唱2009-12-01 22:14 送鲜花  49朵   附言:thank you.

without further ado, let’s get started
2009-12-01 21:53
hjw912258
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2010-6-8
收藏
得分:0 
路过
2010-06-12 18:02
快速回复:为什么是这个结果?谁来帮我解释一下:
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019939 second(s), 11 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved