web-dev-qa-db-ja.com

C言語の「ショートサーキット」とは何ですか?

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

15
fasil

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

例として&&、それはかなり明白です0 && WhoCaresは、WhoCaresが何であってもfalseになります。このため、CはWhoCaresの評価をスキップします。同じことが1 || WhoCares、それは常に本当です。このため、次のようなコードを書くことができます

CanFireMissiles && FireMissiles()

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

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

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

 isFileReady() || getFileReady()

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

36
Daniel Gratzer

「Short Circuiting」は通常、「 Short Circuit Evaluation 」を指します。これは、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.
     */
}
4
World Engineer

ショートサーキット評価 は、条件の一部が評価されない可能性があります。

例えば:

if (true || f()) { ... }

fは無視されません。

3
Frank