Cには次のものがあります。
return (abc(1) || abc(2));
abc(1 == 1)
返される場合は、 ?true
が呼び出されます。abc(2)
いいえ、そうはなりません。これは「短絡」と呼ばれ、一般的なフロー制御メカニズムです。
a && b
がtrue の場合にb
のみ評価されます。a
が偽の場合a
、式全体が必ず偽でなければなりません。
a || b
がfalse の場合にb
のみ評価されます。a
が false の場合でもa
、式全体が true である可能性があります。
いいえ。 if returnsが呼び出されないことが( The Standardによって) 保証されています。abc(1)
true
abc(2)
abc(1)
が返される場合false
、それが保証され、それabc(2)
が呼び出されます。
と似てい&&
ます: if you haveabc(1) && abc(2)
はreturnの場合abc(2)
のみ呼び出され、 returnの場合は呼び出されません。abc(1)
true
abc(1)
false
この背後にある考え方は次のとおりです。
true OR whatever -> true
false OR whatever -> whatever
false AND whatever -> false
true AND whatever -> whatever
これはブール代数から来ています
abc(1==1) が true を返す場合、 abc(2) を呼び出しますか?
いいえ、そうはなりません。この動作は、ショートサーキットと呼ばれます。これは、C および C++ 標準によって保証されています。
C11(n1570)、§ 6.5.13 論理 AND 演算子
&
ビットごとの二項演算子とは異なり、&&
演算子は左から右への評価を保証します。2 番目のオペランドが評価される場合、1 番目と 2 番目のオペランドの評価の間にシーケンス ポイントがあります。最初のオペランドが 0 と等しい場合、2 番目のオペランドは評価されません。
(強調は私です。)
同じことがオペレーターにも当てはまります||
。
||
(論理比較) はそれ以上のチェックを中断しますが、|
(ビットごとの比較) は中断しません。
あなたも読むかもしれません: と || または & および && 比較用
いいえ、2 番目abc(2)
のステートメントは、左のステートメントが次の場合にのみ呼び出されます。false