3

かなり単純なものが欠けているのかもしれませんが、式の最初のポイントをチェックしているにもかかわらず、ポインターを逆参照するとクラッシュします。

if( var1 &&
    bool1 || bool2 &&
    var1->DoSomething() )
{

}

var1 は null ポインターですが、Var1->Dosomething() はまだ呼び出されています。私の理解では、 && と || は C++ の演算子は短絡であるため、var1 が null の場合、最初に終了します。それとも、私が見逃しているものがありますか?

4

3 に答える 3

12

ここでは、演算子の優先順位が重要です。&&は よりも優先順位が高いため||、式は と同等です

(var1 && bool1) || (bool2 && var1->DoSomething() )

したがって、はvar1false と評価され、bool1は評価されず(var1 && bool1)、false に (bool2 && var1->DoSomething())なるため、評価する必要があります。bool2たまたま true の場合は、もvar1->DoSomething()評価され、未定義の動作が発生します。

(必要な特定の式ツリー用に) かっこをいくつか追加するだけで問題ありません。

于 2012-01-14T16:13:09.070 に答える
2

&&は よりも優先順位が高いため||、式は として解析され(var1 && bool1) || (bool2 && var1->DoSomething())ます。var1は null ポインターであるため、短絡評価はbool1が評価されないことを意味し、 の左側は||false と評価されます。したがって、式の値を見つけるには、右辺を評価する必要があります (つまり、短絡評価はここでは開始されませ!)。||isの右辺bool2 && var1->DoSomething()、つまりbool2is が真の場合、var1->DoSomething()評価されます。また、null 以外の場合でもvar1、eexpression の結果が常に期待どおりになるとは限らないことに注意してください。

于 2012-01-14T16:17:55.573 に答える
1

Simple. && has higher precedence so your expression reads:

if( ( var1 && bool1 ) || ( bool2 && var1->DoSomething()) )

try

if( var1 && ( bool1 || bool2 ) && var1->DoSomething() )

otherwise the first expression car1 && bool1 fails and the second expression is evaluated. since bool2 returns true apparently your pointer is dereferenced if bool2 is true.

look here for a precedencelist: http://en.cppreference.com/w/cpp/language/operator_precedence or use google.

于 2012-01-14T16:15:35.843 に答える