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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© SailY 中级黑马   /  2014-9-24 17:54  /  4444 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天编程,不知道是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


12 个回复

正序浏览
SailY 中级黑马 2014-9-25 11:13:10
13#
main函数里
  1.     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};
  2.     printf("那个假币是第%d个金币!\n",findCoin(coin,0,29));
复制代码
回复 使用道具 举报
SailY 中级黑马 2014-9-25 11:11:52
12#
崔石炫 发表于 2014-9-25 03:22
所以不建议联系用if判断,
要用

哦,我懂你的意思了,即使在逻辑上囊括了所有条件,如果用了if,最后没有个else return 编译器也会报错。那帮我看看这个程序,找出假金币问题,
  1. //coin[]是质量,front是第一个,back是最后一个(按照0——29编号)
  2. int findCoin(int coin[],int front,int back)
  3. {
  4.     int i,sumf=0,sumb=0,sum=0;
  5.     if(front+1==back)    // 首先就把出口写好,什么时候推出
  6.     {
  7.         if(coin[front]<coin[back])
  8.             return front+1;
  9.         else
  10.             return back+1;
  11.     }else
  12.         if((back-front+1)%2==0)  //分为两组,每组(back-front)/2个(剩余偶数个)
  13.         {
  14.             for(i=front;i<=front+(back-front)/2;i++)
  15.                sumf=sumf+coin[i];     //sumf是前一组(back-front)/2总质量
  16.             for(i=front+(back-front)/2+1;i<=back;i++)
  17.                sumb=sumb+coin[i];    //sumb是后一组(back-front)/2总质量
  18.         
  19.             if(sumf<sumb)
  20.               return findCoin(coin,front,front+(back-front)/2);
  21.             if(sumf>sumb)
  22.               return findCoin(coin,front+(back-front)/2+1,back);
  23.         }else
  24.             if((back-front+1)%2!=0)
  25.                 //分为两组,每组(back-front)/2个余1个(剩余奇数个)
  26.             {
  27.                 for(i=front;i<=front+(back-front)/2-1;i++)
  28.                 sumf=sumf+coin[i];//sumf是前一组(back-front)/2个总质量
  29.                 for(i=front+(back-front)/2+1;i<=back;i++)
  30.                 sumb=sumb+coin[i];       //sumb是后一组(back-front)/2个总质量
  31.                
  32.                 sum=coin[front+(back-front)/2];   // sum是剩余的一个金币质量
  33.               
  34.                 if(sumf<sumb)
  35.                    return findCoin(coin,front,front+(back-front)/2-1);
  36.                if(sumf>sumb)        // 两组质量比较,返回质量小的一组
  37.                     return findCoin(coin,front+(back-front)/2+1,back);
  38.                else
  39.                 if(sumf+sum==sumb+sum)
  40.                  //直到两组质量相同,剩余的一个为假币,返回编号
  41.                  return front+(back-front)/2+1;
  42.             }
  43. }
复制代码
回复 使用道具 举报
三目运算符不是更好?
你问题的原因在于,不是所有判断分支都有返回值,意思就是,如果有一种情况,这两个if都不满足,那怎么办?没有返回值?
回复 使用道具 举报
一个选择结构搞定的问题,愣是让你复杂化....
回复 使用道具 举报
SailY 发表于 2014-9-24 21:34
int max(int a,int b)
{
    if (a>b)

所以不建议联系用if判断,
要用
  1. if()
  2. {

  3. }
  4. else if()
  5. {

  6. }
  7. ...
  8. else
  9. {

  10. }
复制代码



编译器没那么聪明的,看到你3个if,就是没有else,就认为有可能没有分支能产生返回。
它不知道你这3个if判断囊括了所有的可能性,必有一个能产生返回
假如这个函数返回类型是void ,那你的3个if肯定没问题
回复 使用道具 举报
SailY 中级黑马 2014-9-24 21:35:31
8#
  1. int max(int a,int b)
  2. {
  3.     if (a>b)
  4.         return  a;
  5.    if (a<b)
  6.         return b;
  7.     if(a == b)
  8.         return a;
  9. //    else
  10. //        return a;
  11.    
  12. }
复制代码
回复 使用道具 举报
SailY 中级黑马 2014-9-24 21:34:30
7#
崔石炫 发表于 2014-9-24 19:45
Control may reach end of non-void function
这个错误就是因为你两个if分支,
在a == b的情况下无法产生返 ...

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的比较就三种把

回复 使用道具 举报
Visual C++6.0会报这个警告的
回复 使用道具 举报

windows下面是会有?你用的什么软件,我记得我原来用VC没这个报错啊
回复 使用道具 举报
Control may reach end of non-void function
这个错误就是因为你两个if分支,
在a == b的情况下无法产生返回,因为两个if分支都不符合,
没有return 任何值。
既然max函数声明为int类型的返回值,就必须保证总有一个分支能产生返回值。
回复 使用道具 举报
正确的代码是:
  1. int max(int a , int b)
  2. {
  3.         if(a > b)
  4.         {
  5.                 return a;
  6.         }
  7.         else
  8.         {
  9.                 return b;
  10.         }
  11. }
复制代码


Xcode里面,if和else后面的大括号{}是不能少的。
建议不要用两个if,把后面的if换成else,
否则有可能告警:“无法到达...返回..bla..bla..bla”,
大概意思就是可能没有符合条件的分支来产生返回。
告警这个我也不知道,windows下面是会有,不知道Xcode,没用过。
回复 使用道具 举报
声明:int max(int ,int);
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马