例えば:
for(j=0;t1&&t2&&t3;j++);
t1 が失敗した場合、for ループは t2 と t3 をチェックしますか?
C は、論理 AND と OR を含む式を短絡するため、式の結果が判明するとすぐに評価が停止します。指定された式は次のとおりです。
t1 && t2 && t3
これは論理 AND 演算子であるため、t1 が false と評価されるとすぐに、t2 と t3 の評価はスキップされます。これは、全体的な結果がわかっているためです。
ISO 9899 C 標準から(これはかなり最近のドラフト バージョンですが、この特定の段落は ANSI-C のドラフトから存在しています)
ビットごとのバイナリ & 演算子とは異なり、&& 演算子は左から右への評価を保証します。最初のオペランドの評価の後にシーケンス ポイントがあります。最初のオペランドが 0 と等しい場合、2 番目のオペランドは評価されません。
鉱山を強調するので、はい、コンパイラは、0 を返すオペランドに遭遇するとすぐに、論理 AND 条件を短絡する必要があります。
いいえ、 ( value && anything ) があり、 value が false になると、他のすべてが無視されます。
for
ループ内および&&
orが使用される他のすべての状況では||
、答えがわかるまで評価が左から右に進みます。その時点で評価は停止しました。これは短絡と呼ばれます。
これは非常に重要な機能です。チェックを前に挿入することで後続の式を「保護」できるからです。例えば、
if (ptr != 0 && ptr->property == 42) {
}
ptr == NULL
短絡だけでクラッシュすることはありません。それがなかったら、プログラマーはもっと楽しくないものを書くことを余儀なくされていたでしょう
if (ptr != 0) {
if (ptr->property == 42) {
}
}
クラッシュを避けるために。
いいえ、C および C++ は条件の「短絡」を保証します。つまり、条件が決定されるとすぐに「テスト」が停止します&&
。an 、false にすることはできません。true
true
||
これにより、次のようなことを安全に行うことができます。
if (ptr != NULL && ptr->x > 10) ...
最初の条件が false であると、ステートメント全体が false になるため、論理的には必要ありません。専門的には「短絡評価」と呼ばれています。t2
これが、副作用を引き起こす条件を作成しt3
て、ループのサイクルごとに発生していると想定してはならない理由です。
for(j=0; (t1 && t2) && (t2 && t3); j++); // 動作するはずです
質問を読み間違えました。いいえ、それはしません。C は短絡評価を使用します。つまり、偽になるとすぐに偽になります。