1

例えば:

for(j=0;t1&&t2&&t3;j++);

t1 が失敗した場合、for ループは t2 と t3 をチェックしますか?

4

7 に答える 7

2

C は、論理 AND と OR を含む式を短絡するため、式の結果が判明するとすぐに評価が停止します。指定された式は次のとおりです。

t1 && t2 && t3

これは論理 AND 演算子であるため、t1 が false と評価されるとすぐに、t2 と t3 の評価はスキップされます。これは、全体的な結果がわかっているためです。

于 2013-02-11T01:05:28.487 に答える
1

ISO 9899 C 標準から(これはかなり最近のドラフト バージョンですが、この特定の段落は ANSI-C のドラフトから存在しています)

ビットごとのバイナリ & 演算子とは異なり、&& 演算子は左から右への評価を保証します。最初のオペランドの評価の後にシーケンス ポイントがあります。最初のオペランドが 0 と等しい場合、2 番目のオペランドは評価されません

鉱山を強調するので、はい、コンパイラは、0 を返すオペランドに遭遇するとすぐに、論理 AND 条件を短絡する必要があります。

于 2013-02-11T01:05:33.833 に答える
1

いいえ、 ( value && anything ) があり、 value が false になると、他のすべてが無視されます。

于 2013-02-11T00:59:29.880 に答える
1

forループ内および&&orが使用される他のすべての状況では||、答えがわかるまで評価が左から右に進みます。その時点で評価は停止しました。これは短絡と呼ばれます。

これは非常に重要な機能です。チェックを前に挿入することで後続の式を「保護」できるからです。例えば、

if (ptr != 0 && ptr->property == 42) {
}

ptr == NULL短絡だけでクラッシュすることはありません。それがなかったら、プログラマーはもっと楽しくないものを書くことを余儀なくされていたでしょう

if (ptr != 0) {
    if (ptr->property == 42) {
    }
}

クラッシュを避けるために。

于 2013-02-11T01:00:17.050 に答える
1

いいえ、C および C++ は条件の「短絡」を保証します。つまり、条件が決定されるとすぐに「テスト」が停止します&&。an 、false にすることはできません。truetrue||

これにより、次のようなことを安全に行うことができます。

if (ptr != NULL && ptr->x > 10) ... 
于 2013-02-11T01:00:19.567 に答える
0

最初の条件が false であると、ステートメント全体が false になるため、論理的には必要ありません。専門的には「短絡評価」と呼ばれています。t2これが、副作用を引き起こす条件を作成しt3て、ループのサイクルごとに発生していると想定してはならない理由です。

于 2013-02-11T00:58:19.173 に答える
0

for(j=0; (t1 && t2) && (t2 && t3); j++); // 動作するはずです

質問を読み間違えました。いいえ、それはしません。C は短絡評価を使用します。つまり、偽になるとすぐに偽になります。

于 2013-02-11T00:59:14.613 に答える