OK, ich bin ein wenig embarassed diese Frage zu stellen, aber ich möchte nur sicher sein ...Kurzschlussauswertung und Nebenwirkungen
Es ist bekannt, dass C Kurzschlussauswertung in Booleschen Ausdrücken verwendet:
int c = 0;
if (c && func(c)) { /* whatever... */ }
In diesem Beispiel func(c)
wird nicht genannt, weil c
-0
auswertet. Aber wie wäre es mit einem anspruchsvolleren Beispiel, bei dem die Nebenwirkungen des Vergleichs die Variable, die als nächstes verglichen wird, verändern würden? Wie folgt aus:
int c; /* this is not even initialized... */
if (canInitWithSomeValue(&c) && c == SOMETHING) { /*...*/ }
Funktion canInitWithSomeValue
true zurück und ändert Wert bei gegebenen Zeiger im Erfolgsfall. Ist sichergestellt, dass nachfolgende Vergleiche (c == SOMETHING
in diesem Beispiel) den Wert canInitWithSomeValue(&c)
verwenden?
Egal, wie viel Optimierungen der Compiler verwendet?
Ich denke, Sie können Kurzschlussauswertung und Compiler-Optimierung verwirren. Im ersten Beispiel wird der Compiler die gesamte 'if'-Anweisung optimieren, da sie niemals ausgeführt werden kann. Eine Kurzschlußauswertung würde bedeuten, dass, wenn Sie 'if (func1() && func2()) {...}' und func1() zur Laufzeit ** auf ** ausgewertet hätten (dh nicht beim Kompilieren), dann Der Code sollte 'func2()' nicht überprüfen - der Compiler hätte den Maschinencode so erstellen sollen, dass 'func2()' nicht aufgerufen wird, wenn 'func1()' falsch ist. – Stephen
Dass "int c = 0" da war, um anzuzeigen, dass "c" zum Zeitpunkt des Vergleichs gleich "0" ist, ist mir klar, dass in einem Fall, in dem der Compiler einfach das gesamte if optimieren würde. –
Ah, ich entschuldige mich. Ich habe dich falsch gelesen. Entschuldigen Sie. – Stephen