の左部分は&&
常に右部分の前に評価されますか?
変えられるか迷ってるから知りたい
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
れません。false
b
if(a && b)
- である場合a
はtrue
、式が になるb
ため、チェックされます。false
false
if(a || b)
- である場合、これa
はとにかくであるため、チェックされません。true
b
true
if(a || b)
- である場合はa
、false
チェックb
されます。b
true
true
はい。&&
演算子、||
、,
および(三項演算子)の評価順序は? :
、左から右に保証されます。シーケンス ポイントは、これらのオペランドの左部分式と右部分式の間に発生します。&&
これらの演算子 ( 、||
および)の左部分式のすべての副作用は、,
その右部分式にアクセスする前に完了します。
右側が最初に評価され
arr[0-1]
て参照される場合、未定義の動作が発生しますか?
はい。その場合、未定義の動作が発生します。(しかし、そのようには起こらないので、未定義の動作はありません。)