Frage

Betrachten Sie diese

Class* p = NULL;
if( p != NULL && p->Method() == OK ){

  // stuff
}

Auf allen Compilern ich gearbeitet habe, ist dies ziemlich sicher. D. h der erste Teil der Boolesche Ausdruck wird bewerten false , und der Aufruf von Methode () wird daher nicht da Auswertung versucht werden, der zweite Teil redundant ist.

Ist dies, weil die meisten Compiler werden die Bewertung des zweiten Teils optimieren weg, oder ist es ein diktierte Verhalten von den C / C ++ Standards?

War es hilfreich?

Lösung

Dies ist boolean Kurzschlüsse genannt und ist in viele Sprachen definiert. Hier ist ein Wikipedia-Artikel, welche Sprachen haben diese Funktion beschreibt.

Nun, da Sie den richtigen Namen für das Feature wissen, gibt es andere SO Artikel über sie auch.

Andere Tipps

Expression kurzes Schneiden durch den Standard gewährleistet ist.

С ++ Standard-1998
Abschnitt 5.14

  

Die Operator && Gruppen von links nach rechts.   Die Operanden sind beide implizit   Umgerechnet auf Typ bool (Ziffer 4). Das   Ergebnis ist wahr, wenn beide Operanden   wahr und falsch anders. Nicht wie &, &&   Garantien von links nach rechts Bewertung:   der zweite Operand nicht ausgewertet, wenn   der erste Operand falsch ist.

Ich habe nicht gesehen, erwähnt noch, so:

Ein Kurzschließen von C garantiert ++ außer wenn der && oder || Operator aufgerufen wird überlastet ist . Aber tun das nicht, weil es zu verwirrend ist.

Dies ist eine Funktion Kurzschluss genannt. Dieses Verhalten wird von der C ++ Standard garantiert. Ich glaube nicht, dass es sich um eine Optimierung ist so zu sprechen, aber es ist viel mehr einfach eine Sprache-Funktion.

Es ist nicht nur die Optimierung, ist es nützlich, Sie prägnanter sein zu lassen.

Als Ihr Beispiel zeigt, können Sie damit eine „sichere“ dereferencing Anweisung in einer Zeile schreiben. Ansonsten haben Sie etwas zu tun:

if (p != null) {
    if (p.getValue() == 3) {
        // do stuff
    }
}

Es scheint trivial, aber versuchen Sie Codierung in einer Sprache, die es nicht hat (zum Beispiel VB6), und Sie beginnen, um es sehr vermissen.

Es ist in den Sprachstandards wie andere Antworten erwähnen, aber nur, weil so etwas werden, muss eindeutig festgelegt. Dass es möglicherweise zu optimierten Code kompiliert nach unten kann, ist ein Nebeneffekt; in diesen Tagen, eine anständige C oder C ++ Compiler würde die einzeilige oder zweizeilige Anweisungen kompilieren equivilently

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top