Es funktioniert garantiert: logische UND- und OR-Ausdrucksketten werden von links nach rechts ausgewertet, und wenn der erste Teilausdruck die Bedingung erfüllt, werden keine weiteren Teilausdrücke ausgewertet.
In Ihrem Fall, wenn currentNode
Null ist, wird es nie durch den zweiten Teilausdruck dereferenziert, so dass der Code sicher ist.
Wie @jdv obwohl darauf hingewiesen wird diese Kurzauswertung genannt, nicht lazy evaluation. Bei letzterem handelt es sich um eine Programmiertechnik, bei der Sie für den Kunden den erforderlichen Wert nur beim ersten Mal berechnen, wenn er konkret benötigt wird. Ein einfaches Beispiel:
class Example {
SomeClass *theObject = null;
public:
SomeClass *getTheObject() {
if (!theObject) {
theObject = doResourceConsumingCalculation();
}
return theObject;
}
};
Beachten Sie, dass der Kunde von Example
der Umsetzung Details nicht bewusst ist, dass theObject
lazily ausgewertet, so dass Sie frei hin und her zwischen eifrig und faul Auswertung zu ändern, ohne die öffentliche Schnittstelle des zu beeinflussen Klasse.
(Natürlich in realen Produktionscode sollten getTheObject
in einer separaten CPP-Datei implementiert werden, und es sollte wahrscheinlich auch die Synchronisation, Fehlerbehandlung Code usw. Dies ist nur ein einfaches Beispiel :-)
Es wird immer funktionieren, aber es könnte immer noch eine schlechte Idee sein. :) Mehr Kontext ist erforderlich, um den Code zu bewerten. –
@Karl: Was denkst du ist schlecht daran? –
Es ** könnte ** schlecht sein, * abhängig vom Kontext *, dass "currentNode" an erster Stelle ein Zeiger ist oder dass es Null sein darf, oder dass die Logik auf diese Weise funktioniert, oder ... –