我在这个二进制搜索算法上遇到了奇怪的编译器错误。我收到警告
control reaches end of non-void function
。这是什么意思?
int binary(int val, int sorted[], int low, int high) {
int mid = (low+high)/2;
if(high < low)
return -1;
if(val < sorted[mid])
return binary(val, sorted, low, mid-1);
else if(val > sorted[mid])
return binary(val, sorted, mid+1, high);
else if(val == sorted[mid])
return mid;
}
编译器无法从该代码判断函数是否会到达终点并仍然返回一些东西。为了清楚起见,将最后一个
else if(...)
替换为else
。
编译器不够聪明,无法知道
<
、>
和 ==
是一个“完整集”。您可以通过删除条件“if(val == sorted[mid])”让它知道——这是多余的。就说“else return mid;
”
始终构建至少最小的优化。使用
-O0
,编译器可以用来确定执行不能到达函数末尾的所有分析都已被禁用。这就是您看到警告的原因。你唯一应该使用 -O0
的时间是进行逐行调试,这通常不是一个好的调试方法,但这是大多数开始使用 MSVC 的人学到的...
我有同样的问题。我下面的代码不起作用,但是当我用“else”替换最后一个“if”时,它起作用了。错误是:可能到达非空函数的结尾。
int shifted(char key_letter)
{
if(isupper(key_letter))
{
return key_letter - 'A';
}
if(islower(key_letter) //<----------- doesn't work, replace with else
{
return key_letter - 'a';
}
}
无论条件语句如何,确保您的代码返回给定返回类型的值
此代码片段显示相同的错误
int search(char arr[], int start, int end, char value)
{
int i;
for(i=start; i<=end; i++)
{
if(arr[i] == value)
return i;
}
}
这是稍作改动后的工作代码
int search(char arr[], int start, int end, char value)
{
int i;
int index=-1;
for(i=start; i<=end; i++)
{
if(arr[i] == value)
index=i;
}
return index;
}
表示正在搜索需要完成的函数
else if(val == sorted[mid]) return mid;
所以,删除 if() 部分并修改代码或在末尾添加一个返回 int 的 else() 。
编译器本身不会知道你给出的条件是最佳的..这意味着你已经涵盖了所有情况.. 因此它总是需要一个 return 语句......所以要么你可以用 else 改变 last else if 或者只在 last else if 之后写 return 0 ;`int binary(int val, int sorted[], int low, int high) { int mid = (low+high)/2;
if(high < low)
return -1;
if(val < sorted[mid])
return binary(val, sorted, low, mid-1);
else if(val > sorted[mid])
return binary(val, sorted, mid+1, high);
else if(val == sorted[mid])
return mid;
return 0; }`
如果它是“主要”功能,只需确保返回 0 或将其更改为 主函数() 到 无效主要()
在代码末尾添加二进制函数:
int binary(int val, int sorted[], int low, int high) { .... return 1;}
如果不满足其中一个条件,则int函数应该返回int。
添加到您的代码:
"#include < stdlib.h>"
return EXIT_SUCCESS;
在
main()
的结尾