黑马程序员技术交流社区

标题: 讲义错了还是老师错了? [打印本页]

作者: venn    时间: 2015-6-18 13:33
标题: 讲义错了还是老师错了?
在第六天的视频中,第十讲中 有一个小点是 讲义中的原话:函数返回值的类型和return实际返回的值的类型应该保持一致,如果两者不一致,则以return实际类型为准,自动进行类型转换。
而老师的实例中却是 以定义类型为准
  1. int sum(int x, int,y){
  2. float b = 3.4f;
  3. return b;
  4. }
  5. int main(int argc,const char *argv[]){
  6. printf("sum = %d\n",sum(34,12));
  7. return 0;
  8. }
复制代码
这个函数点运行结果是 sum = 3

之后老师的总结是
我觉得不一致应该以函数的定义类型为准
到底是讲义错了,老师打错了,还是我错了?

作者: 丁铭检    时间: 2015-6-18 14:41
有木有发现最后要打印出来的是整型就是%d。。。你把主函数里改成打印浮点型的看看。。。
作者: venn    时间: 2015-6-18 15:32
丁铭检 发表于 2015-6-18 14:41
有木有发现最后要打印出来的是整型就是%d。。。你把主函数里改成打印浮点型的看看。。。 ...

可以编译但是结果,,,

8F74718B-8D3E-49C3-A7B7-241070EA6CF3.png (58.26 KB, 下载次数: 51)

8F74718B-8D3E-49C3-A7B7-241070EA6CF3.png

作者: 丁铭检    时间: 2015-6-18 16:24
如果不一致,则以函数类型为准。如果缺省函数类型,则系统一律按整型处理。
   -------这个是网上说的,感觉以网上为准吧。。。不过建议尽量不要出现这种情况。。
作者: zhanghao2744491    时间: 2015-6-18 17:46
问下老师去啊。
作者: 白0702    时间: 2015-6-18 18:26
这个应该是以函数类型为准的,用的时候最好使两者一致,避免产生错误。
作者: 天下1083    时间: 2015-6-18 19:14
返回的吧
作者: 张国繁    时间: 2015-6-18 21:54
你这是什么时候讲的?
作者: zilin    时间: 2015-6-18 22:59
这个还是值得讨论讨论
作者: kalon    时间: 2015-6-19 00:54
    这里面存在了一个强制转换吧?要把float类型强制转换成int类型,强制转换的话会出现数据丢失的情况,但是最终的结果肯定是被强制转换掉了。
    然后被强制转换之后还会在主调函数main函数之中被调用。
    所以,个人认为,一,应尽量保持一致,二,应以定义类型为准。
作者: lipeng524824    时间: 2015-6-19 01:15
这个应该与函数类型一致的!
作者: venn    时间: 2015-6-19 08:32
张国繁 发表于 2015-6-18 21:54
你这是什么时候讲的?

基础视频你没看?
作者: venn    时间: 2015-6-19 08:34
kalon 发表于 2015-6-19 00:54
这里面存在了一个强制转换吧?要把float类型强制转换成int类型,强制转换的话会出现数据丢失的情况,但 ...

定义类型???/
作者: venn    时间: 2015-6-19 08:36
lipeng524824 发表于 2015-6-19 01:15
这个应该与函数类型一致的!

楼上说的对么 ?
作者: yuang4074    时间: 2015-6-19 10:18
本帖最后由 yuang4074 于 2015-6-19 10:26 编辑

   你错了。你现在得到结果只是碰巧对了。如果要从本质分析的话,你的理解是错误的,因为在C语言中int 和 long int 都是32位的,float 是32位的,double 是64位的. float最终当double来处理。
   假设你是对的,当你用float定义并赋值了一个超过32位表示的数时,以函数定义类型为准的话,返回的数据就不是预期的数据了,因为这个函数只能返回最多32位表示的数据。编译器已经考虑了这一点,为了避免这个错误的发生,按照返回值类型为准,所以你是错误的。
   为什么你的结果用%d输出是3呢?首先是因为3.4f在内存的实际有效表示没超过32位。其次通过强制转换float到int ,3.4转换成了3.这个时候返回后就是3.
   那么你用%f为什么输出的是0.000000呢?通过上面分析,你返回的是一个整型数据3,这个时候你用%f输出,就要遵循%f的输出格式,%f的输出格式是这样要求的,在printf函数里不会帮你自动转换类型的;
   而%f寻的又是64位内存,也就是把3这个内存中的数据(换算为二进制)当成浮点型输出来,这个浮点型是一个很小很小很小的数字,但是显示的精度只能有15位小数,而这个很小很小很小的数字的小数位远大于15.
   那么在屏幕显示或者理解为编译器把这个很小很小很小的数字处理为0,用%f输出就是0.000000
如果还想深入理解:建议看:http://blog.sina.com.cn/s/blog_97b4973a0101j9eo.html;否则,就记住结论或按照正规方式书写代码。

作者: 小小羊    时间: 2015-6-19 12:47
最后是%d打印出来的
作者: 张国繁    时间: 2015-6-19 19:13
venn 发表于 2015-6-19 08:32
基础视频你没看?

只看了前5天的......
作者: venn    时间: 2015-6-20 20:27
张国繁 发表于 2015-6-19 19:13
只看了前5天的......

那你顺便到时候留意一下,,,
作者: 马贺飞    时间: 2015-6-21 23:33
围观学习
作者: venn    时间: 2015-6-22 16:18
马贺飞 发表于 2015-6-21 23:33
围观学习

一起进步 一起学习,,,
作者: S970028126    时间: 2015-6-22 21:41
应该以函数前面的类型为准
作者: Dove丶凡    时间: 2015-6-22 22:49
看的很仔细啊 厉害
作者: venn    时间: 2015-6-23 15:00
Dove丶凡 发表于 2015-6-22 22:49
看的很仔细啊 厉害

不仔细不行啊。。。都是大牛 我都自卑了!!!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2