C言語のような「短絡」とは何ですか?


14

C、C ++、C#、Java、および他の多くで使用されている「短絡」という用語を聞いたことがあります。これは何を意味し、どのシナリオで使用されますか?


6
概念に関するウィキペディアの記事があります:en.wikipedia.org/wiki/Short-circuit_evaluationこれは、&&オペレーターの評価における最適化です。
ウィルベル

1
@wirrbel私もそれが当てはまると信じています||...少なくともそうすべきです。
ラドゥムルゼア

1
@RaduMurzea確かに。コントラスト||&&する&|微妙な違いを見るために。簡単なプログラムを持って評価1 || printf("yay");0 || printf("yay");1 | printf("yay");0 | printf("yay");differecesを見るために
wirrbel

回答:


35

Cの短絡は、論理演算子がすべての引数を評価しない場合です。

たとえば、と&&を考えてみてください。0 && WhoCaresそれが何であれfalseになるのは明らかWhoCaresです。このため、Cはの評価をスキップしますWhoCares。についても同じ1 || WhoCaresことが言え、それは常に真実です。このため、次のようなコードを書くことができます

CanFireMissiles && FireMissiles()

このようにして、潜在的に不可能な操作を回避します。ミサイルを発射できない場合、私たちは確かに試みたくありません。これは一般的にポインター、特にファイルポインターで使用されます。

 bool isN(int* ptr, int n){
     return ptr && *ptr == n;
 }

これは、不要なコンピューティングを回避するために、他の多くの便利な方法で機能します

 isFileReady() || getFileReady()

これにより、必要がない場合に余分な作業を行う必要がなくなります。


1
私はあなたの質問に答えてきた場合には答えとしていつでも、あなたはあなたの質問をマークするために、それの横にあるチェックボックスをチェックすることができます
ダニエルGratzerを

7
CanFireMissiles && FireMissiles()副作用を引き起こすために短絡を乱用しているのではないかと疑うので、私は好きではありません。条件付きでアクションを隠しているように感じます。このようなコードは、if(CanFireMissiles){FireMissiles();}またはとして記述する方が適切ですif(CanFireMissles){didFireMissiles = TryFireMissiles(); if(didFireMissiles){...}}
ブライアン

2
私は唯一の用途は副作用を隠すことだと主張します。通常、「都市を爆破する」ソートではなく、ポインターの間接参照やシステムリソースの使用なども、Cでこの方法で頻繁に行われます。ウィキペディアのページをご覧ください。使用中のセクション全体は「副作用を隠す」です
ダニエル・グラッツァー

2
@jozefgを使用してIsInCache(value) || IsInDatabase(value)、IsInDatabaseに時間がかかる可能性のある(特にモバイルデバイスとネットワーク遅延が問題となる場合)などの高価な操作の実行を防ぐこともできます。
mgw854

4

「ショートサーキット」とは、通常、「ショートサーキット評価」を指します。これは、C固有のものではなく、一般的な概念です。

ブール演算子は左から右に評価されるため、他の用語を不要にする用語は有用です。したがって、後で他の条件を除外する条件をチェックし、全体を評価するのではなく、論理演算の部分的な評価を許可することができます。

例:

while((x && y) == 1) {
    //This bit will not execute if x is 0 or y is 0 but y won't even be 
    //evaluated due to short circuit evaluation if x is 0.
}

より複雑な例:

if((a || b || c || d || e || f || g || h || i || j || k) == 1) {
    /* If any of these are equal to 1 the whole expression is equal to 1,
     * thus doesn't it make sense to short circuit evaluate this?
     * Saves a bunch of time.
     */
}

8
短絡とは、時間を節約することではなく、評価されないことです。評価されていない関数も、評価された場合の副作用はありません。
ピーターB

ご存知のように、これ== 0は不必要なだけでなく、実際に一部の人々を混乱させる可能性があります。
デデュプリケーター

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.