2

三項演算子を使用しているときに式を返すことができない理由を教えてください。

while( root != nullptr )
{
    if( current->data > v ) {
        ( current->left == nullptr ) ? return false : current = current->left;
    } else if( current->data < v ) {
        current->right == nullptr ? return false : current = current->right;
    } else if( current->data == v ) {
        return true;
    }
}
return false;

false を返そうとするとエラーが発生するのはなぜですか? 私はこれを行うことができることを理解しています:

return ( ( 0 == 1 ) ? 0 : 1 );

しかし、式の 1 つから戻ろうとしているときのコンパイラの問題は何でしょうか?

4

2 に答える 2

8

問題は、returnステートメントに定義された値がない (式ではない) ことですが、三項演算子の右側の 2 つの要素にはそれぞれ値があるはずです。コードにもバグがあります。ループはテストする必要がcurrentありnullptrます。rootループを介して変更されないため、ループが正常に終了することはありません。

ネストされたifステートメントとして書き直すだけです。

current = root;
while( current != nullptr )
{
    if( current->data > v ) {
        if( current->left == nullptr ) return false;
        current = current->left;
    } else if( current->data < v ) {
        if( current->right == nullptr) return false;
        current = current->right;
    } else if( current->data == v ) {
        return true;
    }
}
return false;

returnただし、実際には、この特定のロジックでは、内部ステートメントはまったく必要ありません。

current = root;
while( current != nullptr )
{
    if( current->data > v ) {
        current = current->left;
    } else if( current->data < v ) {
        current = current->right;
    } else if( current->data == v ) {
        return true;
    }
}
return false;

ただし、三項演算子に夢中になっていて、単にそれを使用する必要がある場合は、次のことができます。

current = root;
while( current != nullptr )
{
    if( current->data == v ) {
        return true;
    }
    current = (current->data > v) ? current->left : current->right;
}
return false;
于 2012-09-10T18:21:28.030 に答える
2

三項演算子は、複数の部分式から新しい式を作成します。returnステートメントは式ではありません。

于 2012-09-10T18:24:06.610 に答える