2016-06-16 5 views
1

をさんは、このC-コード例を見てみましょう:依存チェーンアップのif文

int ID = 0; 
if( (Check(&ID) == ERROR) 
    ||(ID == -1) 
){ 
    return ERROR; 
} 

あなたは(Check(&ID) == ERROR)(ID == -1)をチェックしているという保証はありますか?

答えて

1

はい(明確に、私の意見では、と)同等に適用されますオペランド||のオペランド。

N1570 5.1.2.3プログラムの実行は、第3項は言う:

式A及びBの評価の間の配列点 の存在がAに関連付けられたすべての値の計算と 副作用が配列決定されることを意味

B.

論理OR演算子

N1570 6.5.14に関連したすべての値の計算と副作用 前に、第4項は言う:

ビット単位の|演算子、||オペレータは左から右の評価を保証します。 第2オペランドが評価される場合は、最初の の評価と第2オペランドの評価の間にシーケンスポイントがあります。最初のオペランドが0と等しくない場合、2番目のオペランドは で、評価されません。

2

はいあなたは(ID = -1は機能Checkによって設定されたエラー状態、だろう)。フォームx || yの発現のために、yのみ評価さxは0

と評価された場合これは、が短circuttingと呼ばれ、また&&に適用されます。

あなたの括弧も不要である:第一及び第二の評価の間シーケンスポイントがあるので同じことが、

if (Check(&ID) == ERROR || ID == -1)