2011-12-19 9 views
0
この質問はしばらく

入れ子になった場合、その値

のための私を盗聴されています

は次のように動作するコードの部分を持っていることが普通であるチェックそれはブールと一緒に行われるのですか? 最初の2つのifが1行にあるかもしれないと思いますが、異なる環境でどのような順序でチェックされているのかわからないので、読みにくくなるかもしれません。

+1

コンテキストとは何ですか? 1つは、最初の2つのifを 'if(ptr && ptr-> value == foo)'に置き換えることができます。しかし、最終的なコードは、表示されていない残りのコードに依存します。 – fge

答えて

0

すべてのコンパイラは同じprecedence orderに従わなければならないので、チェックはこれで置き換えることができます:最初の部分(単独ptr)がfalseの場合

if (ptr && ptr->value == foo) 
{ 
    print("error"); 
    failed = true; 
} 

、そして式の残りの部分は評価されません。これを短絡といいます。

+0

ありがとう!私はちょうどグーグルがすべきリンクのためにありがとう – richy

2

あなたは常にブール演算子short-circuitingに頼ることができます。

const bool failed = (ptr != NULL) && (ptr->value == foo); 

最初(ptr != NULL)がfalseと評価された場合、この第二の部分を評価しません。

2

あなたはこのようなあなたの状態を書き込むことができます。条件が遅延評価され、C++では

if (ptr && ptr->value == foo) 
{ 
    print("error"); 
} 
else 
{ 
    print("all systems go"); 
} 

。最終的な結果がわかるとすぐに評価が停止します。だから、ORのために、最初の真のは、ANDのために、最初の偽はこの場合、評価

+0

それは本当に条件とは関係ありません。ショートサーキットは、ブール演算子のプロパティです。 –

+0

私はより正確でありがとうございます;-) – crazyjul

+0

あなたはようこそ;) –

1

を終了し、評価を停止して、あなたは確かにこれを行うことができます。

if (ptr && (ptr->value == foo)) 
{ 
    print("error"); 
} 
else 
{ 
    print("all systems go"); 
} 

あなたはその論理積と論理的に保証されていますORは左から右に評価され、結果がわかると評価は停止します。これは安全です。

0

あなただけif(ptr && ptr->value == foo')

Cは、最初の条件が失敗した場合、第2の条件がすべてで確認されないことを、確実に書き込むことができます。偽のためです&何か==偽です。

1

failedブール値を後で入力する必要がない場合、そのコードはまったく同じです。

if (ptr && ptr->value == foo) { 
    print("error"); 
} else { 
    print("all systems go"); 
} 

if文におけるチェックの順序は、明確であり、最初の式が真でない場合、第2比較ptr->value=fooをスキップ演算子は&&

関連する問題