-1

C ++がwhileステートメントを評価するときに、whileステートメントの条件が満たされていない場合でも、基になるifステートメントも評価するという問題があります。

ite_candidats は、バイナリ マップ ツリーのカスタム イテレータです。訪問するノードがなくなると、ite_candidat は NULL と評価されます。というわけでしばらく終了。しかし、ite_candidats.clecourante() 呼び出しから、基になるノードが NULL であるというアサーション エラーが発生します。ite_candidats.clecourant() を評価するべきではありません。

プログラムをデバッグ モードで実行したところ、訪問するノードがなくなったときに !!ite_candidats が実際に false と評価されました。ifブロックをコメントアウトすると、プログラムはwhileループから抜け出し、すべて問題ありません...

ite_candidats 演算子 bool() の演算子オーバーロードは、clecourante() を呼び出しません。

while(!!ite_candidats){
    if(ite_candidats.clecourante() != nompersonne){
        {...}
    }
    ite_candidats++;
}
4

3 に答える 3

3

それは無理だ。評価されるifと、 に入りwhileます。先行計算はありませんC++

PS に 2 つの否定があるのはなぜwhileですか?

于 2012-12-07T18:09:32.993 に答える
1

大まかな推測: ite_candidats はコード内でインクリメントされます。おそらく終了イテレータが 0 に評価されていません。

于 2012-12-07T18:24:15.483 に答える
1

ite_candidats は、バイナリ マップ ツリーのカスタム イテレータです。訪問するノードがなくなると、ite_candidat は NULL と評価されます。

本当に NULL と評価されますか? で逆参照演算子ではなくドット演算子を使用しているため、これは少し疑わしいですite_candidats.clecourante()ite_candidatsあなたが投稿したコードから、オブジェクトへのポインタではなく、オブジェクトのインスタンスのように見えます。

ite_candidats 演算子 bool() の演算子オーバーロード

これが問題だと思います。その変換演算!!ite_candidats子を使用して a にキャストite_candidatsし、boolその結果を否定して yield!ite_candidatsにし、再度否定して yield にし!!ite_candidatsます。

問題はoperator bool()、 の前提条件とは異なる条件をチェックしていることですWhatEverYourCustomIteratorClassIsNamed::clecourante()

于 2012-12-07T20:05:55.050 に答える