| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2562 人关注过本帖
标题:为什么是这个结果?谁来帮我解释一下:
只看楼主 加入收藏
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
结帖率:94.74%
收藏
已结贴  问题点数:100 回复次数:18 
为什么是这个结果?谁来帮我解释一下:
我用的是 ubuntu  ,gcc 下出现了意想不到的结果:

程序代码:
#include<stdio.h>
int two_ten(char *);
int main(void)
{
    char a[]="11011.1111111#";
    int n=456;
    n=two_ten(a);
    printf("%d\n",n);
    return 0;
}
int two_ten(char *a)
{
    float num=5.0234;
    int j=1;
    if(*a=='#')
    {
        return 1234;
    }
    two_ten(a+1);
    printf("-----%d----\n",j);
}  



如果不加
printf("-----%d----\n",j);
这句,可以正常显示结果,谁能来告诉我为什么?如何避免?谢谢大家。


[ 本帖最后由 广陵绝唱 于 2009-11-30 01:53 编辑 ]
搜索更多相关主题的帖子: 解释 结果 
2009-11-30 01:52
pgy
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:C
等 级:小飞侠
威 望:8
帖 子:1248
专家分:2329
注 册:2009-9-23
收藏
得分:10 
图片附件: 游客没有浏览图片的权限,请 登录注册

原代码输出结果
图片附件: 游客没有浏览图片的权限,请 登录注册

去掉printf("-----%d----\n",j);显示
图片附件: 游客没有浏览图片的权限,请 登录注册

还真有点意思了...
程序代码:
#include<stdio.h>
float two_ten(char *);
int main(void)
{
    char a[]="1#";
    int n=456;
    n=two_ten(a);
    printf("%d\n",n);
    return 0;
}
float two_ten(char *a)
{
    int j=1;
    if(*a=='#')
    {
        return 1234;
    }
    two_ten(a+1);
    printf("-%d----\n",j);
}
这么看,返回了一个很小的负数,这样,用float返回的时候就是1.#qnan0(超出数值表示范围)。而用int的时候会不会是截取了尾数部分的后一个字节?
printf的返回值也拿到递归的函数里运算...好麻烦...
可能是1234和printf返回值的2个值链接到一起了么?嘿嘿...

[ 本帖最后由 pgy 于 2009-11-30 22:45 编辑 ]

我可好玩啦...不信你玩玩^_^
2009-11-30 08:59
m456m654
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:3
帖 子:783
专家分:2806
注 册:2009-9-17
收藏
得分:10 
楼主想问的是,为什么加了printf("-----%d----\n",j);后,看不到*a==‘#‘时的return值吗?
我运行了一下,也不清楚加了它之后,最后的11是怎么出来的。
不过试了试,要是想加了这句后还能返回正确的值,做一下语句顺序改动:
#include<stdio.h>
int two_ten(char *);
int main(void)
{
    char a[]="11011.1111111#";
    int n=456;
    n=two_ten(a);
    printf("%d\n",n);
    return 0;
}
int two_ten(char *a)
{
    int j=1;
    if(*a=='#')
    {
        return 1234;
    }
    printf("-----%d----\n",j);//就是这两句互换顺序了。
    two_ten(a+1);
}  


[ 本帖最后由 m456m654 于 2009-11-30 10:21 编辑 ]
2009-11-30 10:06
lijm1989
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:珠海
等 级:贵宾
威 望:12
帖 子:675
专家分:2844
注 册:2009-10-14
收藏
得分:0 
的确很神奇····
我觉得应该是printf函数使用栈的时候和递归使用栈的时候冲突了。。。因为二者都是依靠栈来实现的。。而且递归的时候,并不是所有路径都有返回值。。递归到最后的时候返回1234,压入栈。。。但后面又有printf();  俄··查资料看看先。。。期待高手现身~~~~~

[ 本帖最后由 lijm1989 于 2009-11-30 12:18 编辑 ]
2009-11-30 10:27
陈大师
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:231
专家分:1038
注 册:2009-11-4
收藏
得分:0 
顶楼上那匹马先····
2009-11-30 12:32
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:20 
返回:11   是printf("-----%d----\n",j);函数返回的值,输出含换行符11个字符。
解析:
int two_ten(char *a)
{
    float num=5.0234;
    int j=1;
    if(*a=='#')
    {
        return 1234;  /* 这里1234值只反回给递归的前一次函数,并非反回给主函数,如a数组第一个字符是'#'才是反回给主函数 */
    }
    two_ten(a+1);
    printf("-----%d----\n",j);
}  

int main(void)
{
    ·
   n=two_ten(a);      反回主函数的值是第一次调用two_ten函数里print函数反回的值,含换行符11个字符
   printf("%d\n",n);
}

————————————————————————————————————————————————————
如把 printf("-----%d----\n",j);去掉一边,
变成 printf("%d----\n",j);会输出含换行符6个字符
结果就是输出:6



[ 本帖最后由 UserYuH 于 2009-11-30 15:35 编辑 ]

努力—前进—变老—退休—入土
2009-11-30 15:33
lijm1989
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:珠海
等 级:贵宾
威 望:12
帖 子:675
专家分:2844
注 册:2009-10-14
收藏
得分:0 
哈哈··有点明白了··可它返回的为什么会是printf的返回值呢??
是因为函数里只有printf往缓存里压入数据还是??

[ 本帖最后由 lijm1989 于 2009-11-30 16:18 编辑 ]
2009-11-30 16:15
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
又改了一下,这回结果又变了,这是为什么呢?这回和 printf 中的格式无关了:


程序代码:
#include<stdio.h>
float two_ten(char *);
int main(void)
{
    char a[]="11011.1111111#";
    float n=456;
    n=two_ten(a);
    printf("%f\n",n);
    return 0;
}
float two_ten(char *a)
{
    float num=5.0234;
    int j=1;
    if(*a=='#')
    {
        return 1234.0;
    }
    two_ten(a+1);
    printf("-%d----\n",j);
}

2009-11-30 16:47
bccnfac
Rank: 2
等 级:论坛游民
帖 子:31
专家分:48
注 册:2009-4-14
收藏
得分:30 
#include<stdio.h>
float two_ten()
{
    if(1) printf("-----\n");
    else return 0;
}
int main(void)
{
    float n;
    n=two_ten();
    printf("%f\n",n);
    return 0;
}

看看你的程序的结果是不是完全等同于这个程序。你的函数只有一半的返回值。
2009-11-30 17:02
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
什么叫  一半的返回值? 楼上的朋友请详细解释一下好吗?谢谢。
2009-11-30 17:22
快速回复:为什么是这个结果?谁来帮我解释一下:
数据加载中...
 
   



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

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