web-dev-qa-db-ja.com

「制御が非ボイド機能の終わりに達する」とはどういう意味ですか?

このバイナリ検索アルゴリズムで奇妙なコンパイラエラーが発生しています。警告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;
}
19
tekknolagi

コンパイラは、そのコードから、関数が最後まで到達しても何かを返すかどうかを判断できません。これを明確にするために、最後のelse if(...)elseだけに置き換えてください。

32
rid

コンパイラは<>、および==は「完全なセット」です。条件 "if(val == sort [mid])"を削除することで、それが冗長であることを知らせることができます。 「else return mid; "

11

少なくとも最小限の最適化で常にビルドします。 -O0、実行が関数の最後に到達できないことを判断するためにコンパイラが使用できるすべての分析が無効になっています。これが、警告が表示される理由です。使用する必要があるのは-O0はステップバイラインデバッグ用であり、通常、とにかく良いデバッグ方法ではありませんが、MSVCを始めたほとんどの人が学んだことです...

0
R..

同じ問題がありました。以下のコードは機能しませんでしたが、最後の「if」を「else」に置き換えたときに機能します。エラーは次のとおりでした:非void関数の終わりに到達する可能性があります。

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'; 
        }

  }
0
Thuy