[英]What does "control reaches end of non-void function" mean?
我在這個二進制搜索算法上遇到了奇怪的編譯器錯誤。 我收到一個警告, 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;
}
編譯器無法從該代碼中判斷 function 是否會到達末尾並仍然返回一些東西。 為了清楚起見,將最后一個else if(...)
替換為else
。
編譯器不夠聰明,無法知道<
、 >
和==
是“完整集”。 您可以通過刪除條件“if(val == sorted[mid])”來讓它知道——這是多余的。 就說“ else return mid;
”
我有同樣的問題。 我下面的代碼不起作用,但是當我用“else”替換最后一個“if”時,它就起作用了。 錯誤是:可能到達非無效 function 的末尾。
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';
}
}
始終以至少最少的優化進行構建。 使用-O0
,編譯器可以用來確定執行無法到達 function 末尾的所有分析都已禁用。 這就是您看到警告的原因。 唯一一次應該使用-O0
是進行分步調試,這通常不是一個好的調試方法,但這是大多數開始使用 MSVC 的人所學到的......
確保您的代碼返回給定返回類型的值,而與條件語句無關
此代碼段顯示相同的錯誤
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;
}
這意味着它正在搜索需要完成的 function。
else if(val == sorted[mid]) return mid;
因此,刪除 if() 部分並修改代碼或在返回 int 的末尾添加 else()。
編譯器本身不會知道您給出的條件是最佳的..這意味着您已經涵蓋了所有情況..因此它總是需要一個返回語句...所以您可以更改 last else if with else 或只是在最后一個 else if;`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; }`
如果它是“主” function 只需確保返回 0 或將其從 int main() 更改為 void main()
添加到您的代碼中:
"#include < stdlib.h>"
return EXIT_SUCCESS;
在main()
的末尾
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.