我在这个二进制搜索算法上遇到了奇怪的编译器错误。我收到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;
}
答案 0 :(得分:30)
编译器无法从该代码中判断该函数是否会到达终点并仍然返回一些内容。为清楚起见,请将最后一个else if(...)
替换为else
。
答案 1 :(得分:11)
编译器不够聪明,不知道<
,>
和==
是“完整集”。您可以通过删除条件“if(val == sorted [mid])”让它知道 - 这是多余的。 Jut说“else return mid;
”
答案 2 :(得分:0)
始终使用至少最小化优化进行构建。使用-O0
,已禁用编译器可用于确定执行无法到达函数末尾的所有分析。这就是你看到警告的原因。您应该使用-O0
的唯一时间是逐行调试,这通常不是一个好的调试方法,但是大多数开始使用MSVC的人都学习了...
答案 3 :(得分:0)
我遇到了同样的问题。我下面的代码不起作用,但当我用“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';
}
}
答案 4 :(得分:0)
确保您的代码无论条件语句如何都返回给定返回类型的值
此代码段显示了相同的错误
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;
}
答案 5 :(得分:0)
这意味着它正在搜索需要完成的功能。
else if(val == sorted[mid]) return mid;
因此,删除if()部分并修改代码,或者在返回int的末尾添加else()。
答案 6 :(得分:0)
编译器本身不会知道您给出的条件是最佳的..这意味着您已经涵盖了所有情况.. 所以它总是需要一个 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; }`
答案 7 :(得分:0)
如果函数是非空的,这意味着它必须在到达函数块末尾[_}]之前返回一些东西。所以,当我们只给出 if 和 else-if 语句时,编译器无法从该代码中分辨出来,这些语句中的任何一个都会被评估为真并返回一些东西。意思是,如果所有条件评估为假,那么控制将到达函数的末尾,而不返回任何东西,这是错误的。
答案 8 :(得分:-5)
添加到您的代码中:
"#include < stdlib.h>"
return EXIT_SUCCESS;
在main()