鱼C论坛

 找回密码
 立即注册
查看: 2082|回复: 17

[已解决]return的一个鸟问题

[复制链接]
发表于 2017-5-18 15:57:57 | 显示全部楼层 |阅读模式
1鱼币
实不相瞒,吾乃小白一枚,初入C道,不得其法。吾今求一良师,必当勤学苦练,师若不弃,或跪或躺,岂不快哉?

好吧,大脑刚刚短路了一下,下面进入正题:

就是说,有一个很小的程序想请各位大神看一下子,为啥输出的是这些乱七八糟的玩意...

程序是这样纸的:

#include<stdio.h>

char foo(int a,int b);

char foo(int a,int b)
{
     return ;
}

int main()
{
    int  x,y,z;

    z=foo(x,y);
    printf("%d\n",z);

    return 0;
}

我是用gcc编译的,程序编译通过输出16. 如果将char替换成int输出134513424;如果将char替换成float输出-2147483648.

小编看到结果的时候顿时就蒙圈啦!不同编译器输出会有差别吗?具体的原理是啥呢?

帮帮我吧,不然晚上又要失眠啦,呜呜~
最佳答案
2017-5-18 15:57:58
1.你那个函数根本没有返回值,所以无论你的返回类型变成 int或者 char无论什么类型,编译器由于没找到返回值就在内存里随地找了个数字,那个结果是不确定的. 至于你那个主函数里的z = foo (x, y)后面那函数部分输不输入值根本没啥意义,,,,因为没有返回值,所以结果都是不确定的.

2. char类型占1个字节也就是最多4位, int和float都是4个字节最多32位,编译器可能只是随意在这些范围内从内存里找个数字罢了。

我觉得这个版主好过分啊, 你厉害你看得懂就解释下,贴个新学的人看不懂的代码装隔壁。真以为自己牛逼死了

最佳答案

查看完整内容

1.你那个函数根本没有返回值,所以无论你的返回类型变成 int或者 char无论什么类型,编译器由于没找到返回值就在内存里随地找了个数字,那个结果是不确定的. 至于你那个主函数里的z = foo (x, y)后面那函数部分输不输入值根本没啥意义,,,,因为没有返回值,所以结果都是不确定的. 2. char类型占1个字节也就是最多4位, int和float都是4个字节最多32位,编译器可能只是随意在这些范围内从内存里找个数字罢了。 我觉得这个版主好过分 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-5-18 15:57:58 | 显示全部楼层    本楼为最佳答案   
1.你那个函数根本没有返回值,所以无论你的返回类型变成 int或者 char无论什么类型,编译器由于没找到返回值就在内存里随地找了个数字,那个结果是不确定的. 至于你那个主函数里的z = foo (x, y)后面那函数部分输不输入值根本没啥意义,,,,因为没有返回值,所以结果都是不确定的.

2. char类型占1个字节也就是最多4位, int和float都是4个字节最多32位,编译器可能只是随意在这些范围内从内存里找个数字罢了。

我觉得这个版主好过分啊, 你厉害你看得懂就解释下,贴个新学的人看不懂的代码装隔壁。真以为自己牛逼死了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-5-18 16:49:31 | 显示全部楼层
这个在VS下报错的,foo没有一个反回值,我加了一个反回值  return 'a'; a 的ASCII 值是97。输出结果是97。不知道对你没有帮助!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-5-18 16:54:15 | 显示全部楼层
menkey 发表于 2017-5-18 16:49
这个在VS下报错的,foo没有一个反回值,我加了一个反回值  return 'a'; a 的ASCII 值是97。输出结果是97。 ...

谢谢!不过就是想测试return空语句怎么执行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-5-18 17:42:00 | 显示全部楼层
玩美主义 发表于 2017-5-18 16:54
谢谢!不过就是想测试return空语句怎么执行

这是反汇编,自己看看吧
  1.         .file        "tmp.c"
  2.         .intel_syntax noprefix
  3.         .text
  4.         .globl        foo
  5.         .type        foo, @function
  6. foo:
  7. .LFB0:
  8.         .cfi_startproc
  9.         push        rbp
  10.         .cfi_def_cfa_offset 16
  11.         .cfi_offset 6, -16
  12.         mov        rbp, rsp
  13.         .cfi_def_cfa_register 6
  14.         mov        DWORD PTR [rbp-4], edi
  15.         mov        DWORD PTR [rbp-8], esi
  16.         nop
  17.         nop
  18.         pop        rbp
  19.         .cfi_def_cfa 7, 8
  20.         ret
  21.         .cfi_endproc
  22. .LFE0:
  23.         .size        foo, .-foo
  24.         .section        .rodata
  25. .LC0:
  26.         .string        "%d\n"
  27.         .text
  28.         .globl        main
  29.         .type        main, @function
  30. main:
  31. .LFB1:
  32.         .cfi_startproc
  33.         push        rbp
  34.         .cfi_def_cfa_offset 16
  35.         .cfi_offset 6, -16
  36.         mov        rbp, rsp
  37.         .cfi_def_cfa_register 6
  38.         sub        rsp, 16
  39.         mov        edx, DWORD PTR [rbp-8]
  40.         mov        eax, DWORD PTR [rbp-4]
  41.         mov        esi, edx
  42.         mov        edi, eax
  43.         call        foo
  44.         movsx        eax, al
  45.         mov        DWORD PTR [rbp-12], eax
  46.         mov        eax, DWORD PTR [rbp-12]
  47.         mov        esi, eax
  48.         mov        edi, OFFSET FLAT:.LC0
  49.         mov        eax, 0
  50.         call        printf
  51.         mov        eax, 0
  52.         leave
  53.         .cfi_def_cfa 7, 8
  54.         ret
  55.         .cfi_endproc
  56. .LFE1:
  57.         .size        main, .-main
  58.         .ident        "GCC: (GNU) 7.1.0"
  59.         .section        .note.GNU-stack,"",@progbits
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-5-19 09:10:05 | 显示全部楼层
看不大懂,是否可以帮忙解释一下呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-5-19 12:48:46 | 显示全部楼层
为什么还在return个0?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-5-19 13:21:20 | 显示全部楼层
dust188 发表于 2017-5-19 12:48
为什么还在return个0?

return 0是main函数的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-5-19 23:07:52 | 显示全部楼层
玩美主义 发表于 2017-5-19 09:10
看不大懂,是否可以帮忙解释一下呢

看不懂就去学汇编语言
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-5-21 12:46:01 | 显示全部楼层
首先,第一个函数foo的类型只能是int或void,压根儿没有char这种类型(可能有,但鄙人不知)。然后,foo函数的return根本没有返回值。
还有,x和y根本就没有赋值。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-5-21 17:33:42 | 显示全部楼层
首先返回值很明显是随机的,不信你多运行几次,应该是内存中固定一块区域内的值,在我的机器上跟你的输出不一样,float输出的是0,非gcc内核的基本都报错。既然返回值是随机的,那么原理应该是编译器从栈里随便拿了个什么数据就当结果塞给你了。甲鱼的汇编我就学了一半,4楼的代码我也看不大懂。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-5-22 16:59:58 | 显示全部楼层
感谢,不过我这边用GCC编译运行结果前后是一致的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-6-8 17:11:45 | 显示全部楼层
你主函数的C是用来接收返回值的,但是你的c是int类型,而你的返回值类型是char类型,所以不对,。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-6-8 17:13:13 | 显示全部楼层
而且你相应的printf()里输出格式也要相应改变。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-6-11 12:00:53 | 显示全部楼层
很简单,,,返回什么值 取决于eax寄存器里面存的是什么东西。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-6-12 08:12:19 From FishC Mobile | 显示全部楼层
提问的楼主很萌,你连c语言都还没入门。
1 你的函数没返回值 。
2 这段代码有错误:
int  x,y,z;

    z=foo(x,y);//由于函数为返回任何值赋给
变量z所以z所存的值未知。
其实Kiopler兄弟回答的非常好了。
学c要仔细,要认真。
正确代码如下:
#include<stdio.h>

char foo(int a,int b);

char foo(int a,int b)
{     
     printf("我的邮箱\n") ;
     return  'c'  ;
}

int main()
{
    int  x,y,z;

    z=foo(x,y)  ;
    printf("%d   %c\n",    z    ,     z    )  ;

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-6-12 21:06:59 | 显示全部楼层
本帖最后由 world.com 于 2017-6-12 21:09 编辑

不知道是不是想要这个效果,蓝笔圈起来那一块定义的函数没用到
捕获.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-7-3 09:22:46 | 显示全部楼层
yq2424281391 发表于 2017-6-12 08:12
提问的楼主很萌,你连c语言都还没入门。
1 你的函数没返回值 。
2 这段代码有错误:

感谢你的分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 05:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表