0

次のコードの順次検索を Visual C++ で完全に実行しています。

#include<iostream>
using namespace std;

int seqSearch(int list[], int length, int item)
{
    int index = length-1;
    if (index < 0)
        return -1;
    if (list[index] == item)
        return (index);
    else seqSearch(list, index, item);
} // end seqSearch

int main () 
{

    int const length = 10;
    int item;
    int list[10] = { 2, 3, 4, 5, 20, 40, 80, 45, 99, 0};

    cout << "Please enter the value to be searched: ";
    cin>> item;

    if (seqSearch(list, length, item) == -1) cout << "Item not found." << endl;
    else cout <<"Item found at position: " << seqSearch(list, length, item) << " of list *Note: (first index of list start at 0)" << endl;

    system("pause");
    return 0; 
}

しかし、Dev-C++ では常に結果 0 が表示されます。デバッグを試みたところ、インデックスが正しいことを確認できましたが、なぜ 0 が表示されるのでしょうか? VC++ と Dev-C++ にこのような違いがあるのはなぜですか?

4

2 に答える 2

5

関数には、何も返さないint seqSearchコード パスがあります。else seqSearch(list, index, item);これをに変更else return seqSearch(list, index, item);すると、問題が解決するはずです。

今、少し深く掘り下げています。

n2960ドラフトから:

§ 6.6.3/2

関数の最後を流れることは、値を持たない戻りと同じです。これにより、値を返す関数で未定義の動作が発生します。

したがって、標準によると、これは未定義の動作です。

もう少し深く掘り下げる:

  • 非 void 関数から戻らないのがコンパイラ エラーではないのはなぜですか?

すべてのコードパスをチェックして、それらすべてが返されるかどうかを確認するのは難しい操作であり、実装でそれをチェックする必要はありません。

  • VC++ でコードが正しく機能するのはなぜですか?

これは、アーキテクチャと呼び出し規約に依存します。次のコードを試してください:

#include <iostream>

int fun (int v)
{
    int a = v;
}

int main ()
{
    std::cout << fun(5) << std::endl;
}

異なるコンパイラでは、関数は渡された値のfunいずれかまたはすべてを返します。0基本的に、最後に評価された式の値を返すことができます。

于 2012-06-04T08:34:30.067 に答える
3

正しいメソッド定義は次のとおりです。

int seqSearch(int list[], int length, int item)
{
    int index = length-1;
    if (index < 0)
        return -1;
    if (list[index] == item)
        return (index);
    else return seqSearch(list, index, item);
} 

returnステートメントを見逃しました。理想的にはコンパイラーが警告するはずですが、私はDev-Cppが使用するバージョンにあまり精通していません。

于 2012-06-04T07:56:36.790 に答える