の左部分は&&常に右部分の前に評価されますか?
変えられるか迷ってるから知りたい
if(i > 0)
if(someFunc(arr[i-1], arr[i]))
//do work
に
if(i > 0 && someFunc(arr[i-1], arr[i]))
または、右側が最初に評価されarr[0-1]て参照されると、未定義の動作が発生しますか?
の左部分は&&常に右部分の前に評価されますか?
変えられるか迷ってるから知りたい
if(i > 0)
if(someFunc(arr[i-1], arr[i]))
//do work
に
if(i > 0 && someFunc(arr[i-1], arr[i]))
または、右側が最初に評価されarr[0-1]て参照されると、未定義の動作が発生しますか?
はい、論理演算子の短絡動作のため、 2 番目の式の場合、最初の式が真の場合にのみ評価されます。以下をお読みください:&&&&
6.5.13 論理 AND 演算子
&4 ビットごとの二項演算子とは異なり、演算子は評価&&を保証します。left-to-right最初のオペランドの評価の後にシーケンス ポイントがあります。最初のオペランドが 0 と等しい場合、2 番目のオペランドは評価されません。
ブール演算子の短絡は C/C++ で義務付けられていますか? そして評価順?
したがって、i > 0が false の場合 (たとえば if i = 0)、i > 0式の結果は false になり、2 番目のオペランド someFunc(arr[i-1], arr[i]は呼び出されません (評価されます)。
したがって、 if(i > 0 && someFunc(arr[i-1], arr[i]))は安全にコーディングできますが、i - 1の最大インデックス値を超えないように注意してくださいarr[]。本当に私は、ネストされた if ブロックと比較して、この形式の if を好みます (フラットはネストされたブロックよりも優れています)。
@Maroun Marounさんの回答より 「質問する理由はありますif(1 || Foo())か?」役立つ追加情報:
if(a && b)- の場合、チェックさaれません。falsebif(a && b)- である場合aはtrue、式が になるbため、チェックされます。falsefalseif(a || b)- である場合、これaはとにかくであるため、チェックされません。truebtrueif(a || b)- である場合はa、falseチェックbされます。btruetrue
はい。&&演算子、||、,および(三項演算子)の評価順序は? :、左から右に保証されます。シーケンス ポイントは、これらのオペランドの左部分式と右部分式の間に発生します。&&これらの演算子 ( 、||および)の左部分式のすべての副作用は、,その右部分式にアクセスする前に完了します。
右側が最初に評価され
arr[0-1]て参照される場合、未定義の動作が発生しますか?
はい。その場合、未定義の動作が発生します。(しかし、そのようには起こらないので、未定義の動作はありません。)