4

の左部分は&&常に右部分の前に評価されますか?

変えられるか迷ってるから知りたい

if(i > 0)
    if(someFunc(arr[i-1], arr[i]))
        //do work

if(i > 0 && someFunc(arr[i-1], arr[i]))

または、右側が最初に評価されarr[0-1]て参照されると、未定義の動作が発生しますか?

4

2 に答える 2

3

はい、論理演算子の短絡動作のため、 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れません。falseb
  • if(a && b)- である場合atrue、式が になるbため、チェックされます。falsefalse
  • if(a || b)- である場合、これaはとにかくであるため、チェックされません。truebtrue
  • if(a || b)- である場合はafalseチェックbされます。btruetrue
于 2013-10-10T18:28:51.863 に答える
1

はい。&&演算子、||,および(三項演算子)の評価順序は? :、左から右に保証されます。シーケンス ポイントは、これらのオペランドの左部分式と右部分式の間に発生します。&&これらの演算子 ( 、||および)の左部分式のすべての副作用は、,その右部分式にアクセスする前に完了します。

右側が最初に評価されarr[0-1]て参照される場合、未定義の動作が発生しますか?

はい。その場合、未定義の動作が発生します。(しかし、そのようには起こらないので、未定義の動作はありません。)

于 2013-10-10T18:26:58.077 に答える