3

簡単なプロジェクトでの作業中に、私は完全には理解していない状況を見つけました。次のコードを検討してください。

#include <iostream>

using namespace std;

bool test(int k)
{
    cout << "start " << k << endl;

    bool result; // it is important that result's value is opposite to initial value of recheck in main()
    result = false;

    return result;
}

int main()
{
    bool recheck;
    recheck = true;
    for (int i = 2; i > -1; i--)
    {
      recheck = (recheck || test(i));   // (1)
      cout << i << " ???" <<endl;
    }
    cout << "----------------------------" << endl;
    cout << endl;

    recheck = true;
    for (int i = 2; i > -1; i--)
    {
        recheck = (test(i) || recheck);  //different order that in (1)
        cout << i << "???" <<endl;
    }

    return 0;
}

forループから完全に異なる結果を返します。

2 ???
1 ???
0 ???
----------------------------

start 2
2???
start 1
1???
start 0
0???

最初のものtest(int k)は呼び出されていないようです。オペレーターと関係があるのではないかと思います||。誰かがそのような行動を説明できますか?

4

4 に答える 4

13

組み込みの||短絡:左のオペランドがtrue、の場合、右のオペランドは評価されません(この場合、||式の値が保証されるため、右のオペランドの値は関係ありませんtrue)。

完全を期すために、ただし質問には特に関係ありません。C++では、||他の多くの演算子と同様に、演算子はオーバーロード可能です。過負荷を使用した場合、短絡は発生しません。

于 2012-08-22T19:17:27.143 に答える
1

ブール演算子は||、オペランドの1つ(左から右に評価)が残りのオペランドを参照せずに式の結果を決定できる場合に&&短絡します。

の場合||、これは、最初のオペランドが。の場合true、式全体の結果が常にになるため、残りのオペランドは評価されないことを意味しますtrue

最初のループでは、変数recheck(ローカルmain)は常にtrueであるため、関数呼び出しtestを評価する必要はありません。スキップされ、出力は表示されません。

2番目のループでは、test関数呼び出しが最初に評価され、その結果は関数を呼び出した後にのみ決定できるため、関数は反復ごとに呼び出され、出力が表示されます。

于 2012-08-22T19:18:10.373 に答える
0

あなたのコメントは言う:

結果の値がmain()の再チェックの初期値と反対であることが重要です。

test()現在、関数recheckはにローカルなの値を認識できませんmain()

コメントがあなたの意図を反映していると仮定するとrecheck、パラメータとしてtest();に渡す必要があります。!次に、次のような単項演算子を使用できます。

result = ! recheck;

そしてもちろん、必要なときに呼び出されるmain()ようにロジックを修正する必要があります。test()

あなたの要件は私がさらにコメントするのに十分明確ではありません。

于 2012-08-22T19:22:37.350 に答える
0

他の人はあなたが提起した特定の問題に取り組んでいます。連続して複数の疑問符を使用することに注意してください。三重音字シーケンスは2つの「??」で始まります 文字と2つの疑問符の後の3番目の文字は異なって解釈されます。

于 2012-08-22T20:02:21.807 に答える