0

バイナリツリーをポストオーダーで繰り返し印刷する簡単なコードを書いていますが、この奇妙なデバッグ手順に遭遇しました。

ここに画像の説明を入力してください

画像はフォトショップや変更されていません。「ローカル」ウィンドウには、両方のポインタの値が異なることが示されていますが、それらを自分自身およびNULLと比較すると、等式はtrueと「Wat??」を返します。印刷されます、どうしてですか?

私は何かが足りないのですか?

書き直せば

if(pointer1 == NULL && pointer2 == NULL)
    cout << "This won't be printed";

正しく動作します

4

2 に答える 2

10

等式比較演算子(operator ==)は、左側に関連付けられる2項演算子です。したがって、あなたの状態:

pointer1 == pointer2 == NULL

になります:

(pointer1 == pointer2) == NULL、次のいずれかになります。

true == NULLの場合(pointer1 == pointer2); また

false == NULLの場合(pointer1 != pointer2)

NULLブール値に変換されるため、falseこの条件は、のtrue場合にのみ評価されpointer1 != pointer2ます。

ご覧のとおり、これは次のものとは大きく異なります。

(pointer1 == NULL && pointer2 == NULL)

これは、どちらでもないtrue場合にのみ評価されます。pointer1pointer2NULL

于 2013-03-05T12:30:42.133 に答える
1

それはこのように動作します

コンパイラーは最初に、pointer1 == pointer2をチェックします。これはfalse(整数値0)です。これで、結果0がNULLでチェックされます。これもゼロです。したがって、trueを返します。

于 2013-03-05T12:33:28.280 に答える