I've been getting strange compiler errors on this binary search algorithm. I get a warning that control reaches end of non-void function
. What does this mean?
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;
}
The compiler cannot tell from that code if the function will ever reach the end and still return something. To make that clear, replace the last
else if(...)
with justelse
.Always build with at least minimal optimization. With
-O0
, all analysis that the compiler could use to determine that execution cannot reach the end of the function has been disabled. This is why you're seeing the warning. The only time you should ever use-O0
is for step-by-line debugging, which is usually not a good debugging approach anyway, but it's what most people who got started with MSVC learned on...I had the same problem. My code below didn't work, but when I replaced the last "if" with "else", it works. The error was: may reach end of non-void function.
add to your code:
at the end of
main()
The compiler isn't smart enough to know that
<
,>
, and==
are a "complete set". You can let it know that by removing the condition "if(val == sorted[mid])" -- it's redundant. Jut say "else return mid;
"