簡體   English   中英

控制可能會到達非無效函數C的末尾

[英]Control may reach end of non-void function C

我無法編譯我的代碼,但出現錯誤:控件可能會到達非void函數的結尾

/**
 * Returns true if value is in array of n values, else false.
 */
bool search(int value, int values[], int n)
{
    //Binary search algorithm
    int first = 0;
    int last = n-1;
    int middle = (first+last)/2;

    if (n<1)
        return false;
    else
    {
        while (first <= last)
        {
            if (values[middle]==value)
                return true;
            else if(values[middle]<value)
                first=middle+1;
            else if (values[middle]>value)
            {
                last=middle-1; 
            }
            middle=(first+last)/2;
        }
    }

    if (first>last)
        return false;
}

誰能瀏覽我的代碼並幫助我弄清楚問題出在哪里? 我正在努力自己看它! 從我的角度來看,此函數返回true或false

bool返回類型意味着,無論函數采用哪種執行路徑,始終都希望函數在其退出之前返回一個布爾值。 從目前的情況來看 ,檢查時似乎可以“擊倒”最后一個if並且永遠不會擊中return語句。 要進行其他驗證,則需要以某種編譯器無法合理預期的方式逐步執行邏輯。 最后簡單地說:

  if (first>last) {
      return false;
  } else {
      return true;
  }

或更簡而言之:

 return (first > last) ? false : true;

在您的代碼中,函數不可能掉到最后。

但是,不需要編譯器准確診斷功能是否可以結束。 通常,這樣做將需要解決暫停問題。

相反,作為一種實際的措施,編譯器會進行一些基本的檢查和警告,因為它會看到if ( first > last ) return false; ,它沒有進行足夠的代碼分析來確定除非first > last才能永遠無法到達此分支。

要取消顯示此警告,您可以刪除if ( first > last ) 順便說一句,這是警告,不是錯誤; 因此它不應阻止您的編譯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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