为了账号安全,请及时绑定邮箱和手机立即绑定

输出结果为12,能说说为什么吗?我把两个return都删了,为什么还可以输出?return什么用?

输出结果为12,能说说为什么吗?我把两个return都删了,为什么还可以输出?return什么用?

C
慕粉18341035298 2016-07-03 23:23:27
#include <stdafx.h>int zhouchang(int a,int b,int c){ if ((a + b )<= c || (a + c )<= b || (b + c )<= a) {  printf("不能构成三角形");  return 0; } else {  int sum = a + b + c; }}int main(){ int a, b, c; a = 3; b = 4; c = 5; printf("三角形周长为%d", zhouchang(a,b,c));}
查看完整描述

5 回答

已采纳
?
onemoo

TA贡献883条经验 获得超454个赞

一句话总结:歪打正着而已。


你这样写肯定是不对的!  

如果函数声明了有返回值,那就一定要在每一个返回分支处都return相应的返回值,否则返回的值是未定义的

这就是C标准中所谓的“未定义”行为。 返回什么都有可能。

而且这样的代码在编译时,编译器会发现在有的返回分支处你没有return返回值,会给出警告的。


至于为什么好像返回值也是正确的。  这一般与编译器的实现有关。 比如:gcc一般会用eax寄存器来返回这样的值,而这种简单的代码,gcc有可能将sum就储存在eax中,所以结果就恰好正确了。 (这也只是一种推测,具体行为是不是这样,只能看编译后的汇编代码了)

关键是:绝对不要以为这样写代码也是可以的! 这样的代码就是错误的!!  只不过碰巧返回了看似正确的值。

查看完整回答
1 反对 回复 2016-07-04
?
redstonesl

TA贡献55条经验 获得超12个赞

这得看c的函数 是不是默认返回,例如js会默认返回undefined一样。要么编译通不过,要么就是默认。你可以这个思路入手。

查看完整回答
1 反对 回复 2016-07-04
?
木柘

TA贡献143条经验 获得超94个赞

577a2b160001bb9905000241.jpg

577a2b170001c8db05000311.jpg

我觉得应该与编译器有关。函数返回定义为int那么调用处应该会接受到一个int数据,只是不知道具体是什么了。


查看完整回答
1 反对 回复 2016-07-04
  • 慕粉18341035298
    慕粉18341035298
    电脑无法同时放大两个图片,我很难对比出两个代码的不同,这两个代码有什么不同?
  • 木柘
    木柘
    你定义函数返回int那么它一定会返回一个int,只不过这个值不一定是多少。就是说你运气好,碰到的12罢了。图上是在C-free中编译的有return和无return的,明显无return的值不是12.
  • 慕粉18341035298
    慕粉18341035298
    你的意思是每次运行无return的程序结果都不一样?
点击展开后面2
?
留得枯荷听雨声lyx

TA贡献51条经验 获得超16个赞

因为在你的函数里就有输出语句啊,不过return没用吧……

查看完整回答
1 反对 回复 2016-07-04
?
木柘

TA贡献143条经验 获得超94个赞

想问下你是怎么编译通过的?

查看完整回答
反对 回复 2016-07-04
  • 5 回答
  • 1 关注
  • 1920 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信