错误:控制可能会在C中达到非空函数的结束

我无法弄清楚为什么会发生这种错误: 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; } } } 

我理解错误意味着函数可能会在没有返回任何内容的情况下到达终点,但我无法弄清楚这可能会发生什么。

您收到此错误是因为如果您的for循环由于断开条件而中断i < 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 >= n导致循环中断,则控制进入我评论的位置,并且不存在return语句。 因此,您将收到一个错误“达到C中非空函数的结尾”。

另外,在return语句后删除break 。 如果return执行则break永远不会有机会执行并打破循环。

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

检查你的编译器应该给你一个警告 - '无法访问的代码'。

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

 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无需检查其他元素。

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

你的代码相当于

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

要么你习惯于以过于复杂的方式编写非常简单的东西,要么代码不能按你想要的那样做。

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

 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; }