“控制到达无效function的结束”是什么意思?

我在这个二进制搜索算法上遇到了奇怪的编译器错误。 我得到一个警告, 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, mid+1, high); else if(val == sorted[mid]) return mid; } 

编译器无法从该代码中判断该函数是否会到达终点并仍然返回一些内容。 为了清楚起见,用else if(...)替换else if(...)的最后一个。

编译器不够聪明,不知道<>==是“完整集”。 你可以通过删除条件“if(val == sorted [mid])”让它知道 - 这是多余的。 Jut说“别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'; } } 

添加到您的代码:

 "#include < stdlib.h>" return EXIT_SUCCESS; 

main()的末尾