A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© venn 中级黑马   /  2015-6-18 13:33  /  2512 人查看  /  23 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在第六天的视频中,第十讲中 有一个小点是 讲义中的原话:函数返回值的类型和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

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

23 个回复

倒序浏览
有木有发现最后要打印出来的是整型就是%d。。。你把主函数里改成打印浮点型的看看。。。
回复 使用道具 举报
丁铭检 发表于 2015-6-18 14:41
有木有发现最后要打印出来的是整型就是%d。。。你把主函数里改成打印浮点型的看看。。。 ...

可以编译但是结果,,,

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

8F74718B-8D3E-49C3-A7B7-241070EA6CF3.png
回复 使用道具 举报
如果不一致,则以函数类型为准。如果缺省函数类型,则系统一律按整型处理。
   -------这个是网上说的,感觉以网上为准吧。。。不过建议尽量不要出现这种情况。。
回复 使用道具 举报
问下老师去啊。
回复 使用道具 举报
这个应该是以函数类型为准的,用的时候最好使两者一致,避免产生错误。
回复 使用道具 举报
返回的吧
回复 使用道具 举报
你这是什么时候讲的?
回复 使用道具 举报
zilin 中级黑马 2015-6-18 22:59:39
9#
这个还是值得讨论讨论
回复 使用道具 举报
kalon 来自手机 中级黑马 2015-6-19 00:54:51
10#
    这里面存在了一个强制转换吧?要把float类型强制转换成int类型,强制转换的话会出现数据丢失的情况,但是最终的结果肯定是被强制转换掉了。
    然后被强制转换之后还会在主调函数main函数之中被调用。
    所以,个人认为,一,应尽量保持一致,二,应以定义类型为准。
回复 使用道具 举报
lipeng524824 来自手机 中级黑马 2015-6-19 01:15:25
11#
这个应该与函数类型一致的!
回复 使用道具 举报
venn 中级黑马 2015-6-19 08:32:47
12#
张国繁 发表于 2015-6-18 21:54
你这是什么时候讲的?

基础视频你没看?
回复 使用道具 举报
venn 中级黑马 2015-6-19 08:34:21
13#
kalon 发表于 2015-6-19 00:54
这里面存在了一个强制转换吧?要把float类型强制转换成int类型,强制转换的话会出现数据丢失的情况,但 ...

定义类型???/

点评

定义  发表于 2015-6-19 10:58
回复 使用道具 举报
venn 中级黑马 2015-6-19 08:36:09
14#
lipeng524824 发表于 2015-6-19 01:15
这个应该与函数类型一致的!

楼上说的对么 ?
回复 使用道具 举报
本帖最后由 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;否则,就记住结论或按照正规方式书写代码。
回复 使用道具 举报
最后是%d打印出来的
回复 使用道具 举报
venn 发表于 2015-6-19 08:32
基础视频你没看?

只看了前5天的......
回复 使用道具 举报
venn 中级黑马 2015-6-20 20:27:47
18#
张国繁 发表于 2015-6-19 19:13
只看了前5天的......

那你顺便到时候留意一下,,,
回复 使用道具 举报
围观学习
回复 使用道具 举报
venn 中级黑马 2015-6-22 16:18:09
20#

一起进步 一起学习,,,
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马