it-swarm.com.de

Was ist "Kurzschluss" in C-ähnlichen Sprachen?

Ich habe von dem Begriff "Kurzschluss" gehört, der in C, C++, C #, Java und vielen anderen verwendet wird. Was bedeutet das und in welchem ​​Szenario würde es verwendet?

15
fasil

Ein Kurzschluss in C liegt vor, wenn ein logischer Operator nicht alle Argumente auswertet.

Nehmen Sie zum Beispiel und &&, es ist ziemlich offensichtlich, dass 0 && WhoCares wird falsch sein, egal was WhoCares ist. Aus diesem Grund überspringt C nur die Auswertung von WhoCares. Gleiches gilt für 1 || WhoCares, es wird immer wahr sein. Aus diesem Grund können wir Code wie schreiben

CanFireMissiles && FireMissiles()

Auf diese Weise vermeiden wir möglicherweise unmögliche Operationen. Wenn wir die Raketen nicht abfeuern können, wollen wir es auf keinen Fall versuchen. Dies wird häufig bei Zeigern verwendet, insbesondere bei Dateizeigern.

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

Dies spielt sich auf viele andere nützliche Arten ab, um unnötiges Computing zu vermeiden

 isFileReady() || getFileReady()

Dies vermeidet zusätzliche Arbeit, wenn wir nicht müssen.

36
Daniel Gratzer

"Kurzschluss" bezieht sich typischerweise auf " Kurzschlussbewertung ", was ein allgemeines Konzept ist, nicht nur C-spezifisch.

Bewertung der booleschen Operatoren von links nach rechts, daher sind alle Begriffe nützlich, die die anderen Begriffe unnötig machen. Sie können also später nach einer Bedingung suchen, die andere Bedingungen ausschließt, und so eine teilweise Bewertung der logischen Operationen ermöglichen, anstatt das Ganze zu bewerten.

Beispiel:

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.
}

Ein komplexeres Beispiel:

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

Kurzschlussauswertung kann dazu führen, dass einige Teile einer Bedingung nicht ausgewertet werden.

Zum Beispiel:

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

führt nicht aus f.

3
Frank