【问题标题】:Error: control may reach end of non-void function in C错误:控制可能到达 C 中非 void 函数的结尾
【发布时间】:2014-04-20 01:42:32
【问题描述】:

我无法弄清楚为什么会发生此错误:error: control may reach end of non-void function

代码如下:

bool search(int value, int values[], int n) {

    if (n < 1) {
        return false;
    }   

    for (int i = 0; i < n; i++) {
        if (values[i] == value) {
            return true;
            break;
        }
        else { 
            return false;
        }
    }    
}

我了解该错误意味着该函数可能会在没有返回任何内容的情况下结束,但我无法弄清楚这是如何发生的。

【问题讨论】:

  • 编译器不会“深入”分析函数中代码的“意义”。只需在函数末尾添加return false;。这甚至会使第一个 if 变得不必要。
  • 顺便说一句,看起来你的循环只检查values[0]
  • 我知道我在这里聚会迟到了,你的作业已经完成或者你几年前就放弃了,但为了完整起见,我想指出:1)有return true 后绝对不需要中断; return 退出函数,因此跳出循环是多余的。 2)如果(条件)返回真;否则返回假;意味着您只会测试一次条件。简单地说,我永远不会达到高于 0 的值。

标签: c controls


【解决方案1】:

您收到此错误是因为如果您的for 循环由于中断条件i &lt; n; 而中断,那么它在for 循环之后找不到任何return 语句(见下文,我在代码中作为注释提到)。

for (int i = 0; i < n; i++){
    if (values[i] == value){
        return true;
        break;
    }
    else{ 
        return false;
    }
}
  // here you should add either return true or false     
}

如果由于i &gt;= n 而导致for 循环中断,则控制权到达我评论的位置,并且不存在return 语句。因此,您会收到错误“到达 C 中非空函数的末尾”。

另外,在return 语句之后删除break。如果 return 执行然后 break 永远没有机会执行和中断循环。

   return true;  -- it returns from here. 
    break;  -- " remove it it can't executes after return "

检查您的编译器是否应该给您一个警告 - “无法访问的代码”。

【讨论】:

    【解决方案2】:

    有些人可能会讨厌这个,但是....

    bool search(int value, int values[], int n) {
    
       if (n < 1) {
          return false;
       }   
    
       bool ret = false;
       for (int i = 0; i < n; i++) {
          if (values[i] == value) {
             ret = true;
             break;
          }
       }    
       return ret;
    }
    

    【讨论】:

    • 处理 Joe Quinsey 提到的问题
    【解决方案3】:

    你的代码相当于

    return (n > 0 && values [0] == value);
    

    要么您习惯于以过于复杂的方式编写非常简单的东西,要么该代码没有按照您的意愿执行。

    【讨论】:

      【解决方案4】:

      编译器警告不正确。无论如何,您的代码存在更大的问题:

      bool search(int value, int values[], int n) {
      
          if (n < 1) {
              return false;
          }   
      
          for (int i = 0; i < n; i++) {
              if (values[i] == value) {
                  return true;
                  break;
              }
              else {            // !
                  return false; // ! <-- Here is the mistake.
              }                 // !
          }    
      }
      

      此代码只检查values[0] == value,然后总是返回。这是因为else {return false;}

      你应该这样写:

      bool search(int value, int values[], int n) {
      
          if (n < 1) {
              return false;
          }   
      
          for (int i = 0; i < n; i++) {
              if (values[i] == value) {
                  return true;
                  // break;  <- BTW, it's redundant.
              }
          }    
          return false;
      }
      

      现在,函数检查整个 values 数组,如果没有匹配项,则返回 false。但如果它找到匹配项,它会立即返回 true 而不会检查其他元素。

      此外,编译器不会为此代码发出警告。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-02
        • 1970-01-01
        • 2022-01-25
        • 2018-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多