黑马程序员技术交流社区
标题: Xcode的return问题 [打印本页]
作者: SailY 时间: 2014-9-24 17:54
标题: Xcode的return问题
今天编程,不知道是Xcode问题还是代码问题,大家在Xocde试试这个程序:
int max(int a,int b)
{
if (a>b)
return a;
if (a<b)
return b;
}
也就是判断两个数的大小,然后返回一个值,但是编译器会一直报错,Control may reach end of non-void function,main函数有return 0
作者: SailY 时间: 2014-9-24 18:00
声明:int max(int ,int);
作者: 崔石炫 时间: 2014-9-24 19:41
正确的代码是:
- int max(int a , int b)
- {
- if(a > b)
- {
- return a;
- }
- else
- {
- return b;
- }
- }
复制代码
Xcode里面,if和else后面的大括号{}是不能少的。
建议不要用两个if,把后面的if换成else,
否则有可能告警:“无法到达...返回..bla..bla..bla”,
大概意思就是可能没有符合条件的分支来产生返回。
告警这个我也不知道,windows下面是会有,不知道Xcode,没用过。
作者: 崔石炫 时间: 2014-9-24 19:45
Control may reach end of non-void function
这个错误就是因为你两个if分支,
在a == b的情况下无法产生返回,因为两个if分支都不符合,
没有return 任何值。
既然max函数声明为int类型的返回值,就必须保证总有一个分支能产生返回值。
作者: SailY 时间: 2014-9-24 19:46
windows下面是会有?你用的什么软件,我记得我原来用VC没这个报错啊
作者: 崔石炫 时间: 2014-9-24 19:50
Visual C++6.0会报这个警告的
作者: SailY 时间: 2014-9-24 21:34
int max(int a,int b)
{
if (a>b)
return a;
if (a<b)
return b;
if(a == b)
return a;
// else
// return a;
}
又发现一个现象,注释部分不加上的话还是会报错,a、b的比较就三种把
作者: SailY 时间: 2014-9-24 21:35
- int max(int a,int b)
- {
- if (a>b)
- return a;
- if (a<b)
- return b;
- if(a == b)
- return a;
- // else
- // return a;
-
- }
复制代码
作者: 崔石炫 时间: 2014-9-25 03:22
所以不建议联系用if判断,
要用
- if()
- {
- }
- else if()
- {
- }
- ...
- else
- {
- }
复制代码
编译器没那么聪明的,看到你3个if,就是没有else,就认为有可能没有分支能产生返回。
它不知道你这3个if判断囊括了所有的可能性,必有一个能产生返回
假如这个函数返回类型是void ,那你的3个if肯定没问题
作者: ch8898163 时间: 2014-9-25 09:01
一个选择结构搞定的问题,愣是让你复杂化....
作者: cjfire 时间: 2014-9-25 09:10
三目运算符不是更好?
你问题的原因在于,不是所有判断分支都有返回值,意思就是,如果有一种情况,这两个if都不满足,那怎么办?没有返回值?
作者: SailY 时间: 2014-9-25 11:11
哦,我懂你的意思了,即使在逻辑上囊括了所有条件,如果用了if,最后没有个else return 编译器也会报错。那帮我看看这个程序,找出假金币问题,- //coin[]是质量,front是第一个,back是最后一个(按照0——29编号)
- int findCoin(int coin[],int front,int back)
- {
- int i,sumf=0,sumb=0,sum=0;
- if(front+1==back) // 首先就把出口写好,什么时候推出
- {
- if(coin[front]<coin[back])
- return front+1;
- else
- return back+1;
- }else
- if((back-front+1)%2==0) //分为两组,每组(back-front)/2个(剩余偶数个)
- {
- for(i=front;i<=front+(back-front)/2;i++)
- sumf=sumf+coin[i]; //sumf是前一组(back-front)/2总质量
- for(i=front+(back-front)/2+1;i<=back;i++)
- sumb=sumb+coin[i]; //sumb是后一组(back-front)/2总质量
-
- if(sumf<sumb)
- return findCoin(coin,front,front+(back-front)/2);
- if(sumf>sumb)
- return findCoin(coin,front+(back-front)/2+1,back);
- }else
- if((back-front+1)%2!=0)
- //分为两组,每组(back-front)/2个余1个(剩余奇数个)
- {
- for(i=front;i<=front+(back-front)/2-1;i++)
- sumf=sumf+coin[i];//sumf是前一组(back-front)/2个总质量
- for(i=front+(back-front)/2+1;i<=back;i++)
- sumb=sumb+coin[i]; //sumb是后一组(back-front)/2个总质量
-
- sum=coin[front+(back-front)/2]; // sum是剩余的一个金币质量
-
- if(sumf<sumb)
- return findCoin(coin,front,front+(back-front)/2-1);
- if(sumf>sumb) // 两组质量比较,返回质量小的一组
- return findCoin(coin,front+(back-front)/2+1,back);
- else
- if(sumf+sum==sumb+sum)
- //直到两组质量相同,剩余的一个为假币,返回编号
- return front+(back-front)/2+1;
- }
- }
复制代码
作者: SailY 时间: 2014-9-25 11:13
main函数里- int coin[30]={1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
- printf("那个假币是第%d个金币!\n",findCoin(coin,0,29));
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |