回答:
Cの短絡は、論理演算子がすべての引数を評価しない場合です。
たとえば、と&&
を考えてみてください。0 && WhoCares
それが何であれfalseになるのは明らかWhoCares
です。このため、Cはの評価をスキップしますWhoCares
。についても同じ1 || WhoCares
ことが言え、それは常に真実です。このため、次のようなコードを書くことができます
CanFireMissiles && FireMissiles()
このようにして、潜在的に不可能な操作を回避します。ミサイルを発射できない場合、私たちは確かに試みたくありません。これは一般的にポインター、特にファイルポインターで使用されます。
bool isN(int* ptr, int n){
return ptr && *ptr == n;
}
これは、不要なコンピューティングを回避するために、他の多くの便利な方法で機能します
isFileReady() || getFileReady()
これにより、必要がない場合に余分な作業を行う必要がなくなります。
CanFireMissiles && FireMissiles()
副作用を引き起こすために短絡を乱用しているのではないかと疑うので、私は好きではありません。条件付きでアクションを隠しているように感じます。このようなコードは、if(CanFireMissiles){FireMissiles();}
またはとして記述する方が適切ですif(CanFireMissles){didFireMissiles = TryFireMissiles(); if(didFireMissiles){...}}
。
IsInCache(value) || IsInDatabase(value)
、IsInDatabaseに時間がかかる可能性のある(特にモバイルデバイスとネットワーク遅延が問題となる場合)などの高価な操作の実行を防ぐこともできます。
「ショートサーキット」とは、通常、「ショートサーキット評価」を指します。これは、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.
*/
}
== 0
は不必要なだけでなく、実際に一部の人々を混乱させる可能性があります。
&&
オペレーターの評価における最適化です。