簡體   English   中英

“控制到達非空函數的末尾”是什么意思?

[英]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;

錯誤圖片

如果 function 是非空的,這意味着它必須在到達 function 塊 [_} ] 的末尾之前返回一些東西。所以,當我們只給出 if 和 else-if 語句時,編譯器無法從該代碼中判斷出任何這些語句將被評估為 true 並返回一些東西。意味着,如果所有條件評估為 false,那么控件將到達 function 的末尾,而不返回任何東西,這是錯誤的。

我有同樣的問題。 我下面的代碼不起作用,但是當我用“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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM