0

Xcode で C++ プログラムを実行したところ、「コントロールが非 void 関数の終わりに到達する可能性があります」という警告が表示されました。コードは次のとおりです。

Node* search(Node* head, int x)
{
    if(!head)
        return NULL;
    else if(x == head->key)
        return head;
    else if(x < head->key)
        search(head->lchild, x);
    else
        search(head->rchild, x);
}

Linux でコンパイルしたときに同じ警告が表示されましたが、正しい結果が得られました。しかし、Xcode では、結果は間違っていました。ちなみに、Visual Studioでは正解で警告も出ませんでした。

4

3 に答える 3

2

再帰呼び出しの結果を返すつもりだと思います:

Node* search(Node* head, int x)
{
    if(!head)
        return NULL;
    else if(x == head->key)
        return head;
    else if(x < head->key)
        return search(head->lchild, x);
    else
        return search(head->rchild, x);
}
于 2013-10-23T03:36:33.077 に答える
1

あなたの関数はそのままでは、未定義の動作である明示的な6.6.3 リターンなしで関数の最後から流れ出すことができます。

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

最後の 2 つのelseにはreturnステートメントがありません。

 else if(x < head->key)
    search(head->lchild, x);  // No return
 else
    search(head->rchild, x);  // No return
 // no return
}  

したがって、これらの場合、値を返さずに最後まで流れ、未定義の動作を呼び出します。おそらく戻り値を意図していたようですが、それらを省略して、本当にこれを意味していたようです:

else if(x < head->key)
    return search(head->lchild, x); 
else
    return search(head->rchild, x); 
于 2013-10-23T03:37:00.410 に答える
0
else if(x < head->key)
    search(head->lchild, x);
else
    search(head->rchild, x);

これらのブランチでは、次のことを行います。

  • search再帰呼び出し
  • 返される値を破棄する
  • 何も返さない

関数から値を返さないのは未定義の動作です。正しい結果が得られたという事実は、純粋に偶然であり、信頼できるものではありません。コンパイラは、代わりにハード ドライブをフォーマットするか、ピザを注文するかを選択する可能性があります。

returnステートメントを追加して修正します。

else if(x < head->key)
    return search(head->lchild, x);
else
    return search(head->rchild, x);
于 2013-10-23T03:37:46.857 に答える