をさんは、このC-コード例を見てみましょう:依存チェーンアップのif文
int ID = 0;
if( (Check(&ID) == ERROR)
||(ID == -1)
){
return ERROR;
}
あなたは(Check(&ID) == ERROR)
がが(ID == -1)
前をチェックしているという保証はありますか?
をさんは、このC-コード例を見てみましょう:依存チェーンアップのif文
int ID = 0;
if( (Check(&ID) == ERROR)
||(ID == -1)
){
return ERROR;
}
あなたは(Check(&ID) == ERROR)
がが(ID == -1)
前をチェックしているという保証はありますか?
はい(明確に、私の意見では、と)同等に適用されますオペランド||
のオペランド。
N1570 5.1.2.3プログラムの実行は、第3項は言う:
式A及びBの評価の間の配列点 の存在がAに関連付けられたすべての値の計算と 副作用が配列決定されることを意味B.
論理OR演算子
N1570 6.5.14に関連したすべての値の計算と副作用 前に、第4項は言う:
ビット単位の|演算子、||オペレータは左から右の評価を保証します。 第2オペランドが評価される場合は、最初の の評価と第2オペランドの評価の間にシーケンスポイントがあります。最初のオペランドが0と等しくない場合、2番目のオペランドは で、評価されません。
はいあなたは(ID = -1
は機能Check
によって設定されたエラー状態、だろう)。フォームx || y
の発現のために、y
のみ評価さx
は0
と評価された場合これは、が短circuttingと呼ばれ、また&&
に適用されます。
あなたの括弧も不要である:第一及び第二の評価の間シーケンスポイントがあるので同じことが、
if (Check(&ID) == ERROR || ID == -1)