Frage zur Reihenfolge der Arbeitung von boolschen Ausdrücken in if Anweisungen
-
Gibt es bei dem folgenden Stück Code Probleme?
Kann es passieren dass bei der Abarbeitung des Programms in der if Anweisung zuerst der Ausdruck (Titel[0] == 'a') ausgewertet wird und danach (Titel != NULL)?
void Test(const char* Titel) { if ((Titel != NULL) && (Titel[0] == 'a')) { } }
-
Der Definition nach werden die logischen Ausdrücke innerhalb einer If-Bedingung von links nach rechts aus ausgewertet. Dennoch hab ich die Erfahrung gemacht, dass gerade solche Konstrukte ab und an zu Fehlern führen, weil anscheinend doch zuerst der rechte Ausdruck ausgewertet wurde. Daher hab ich mich entschieden soetwas zu vermeiden und für mich das Verhalten in solchen Situationen als undefiniert zu verbuchen.
Eventuell kann jemand mit mehr Erfahrung aber dazu auch etwas anderes sagen.
-
Nein, das ist ganz genau vorgeschrieben. Es ist sogar vorgeschrieben, dass der zweite Ausdruck gar nicht angeguckt wird, wenn das Ergebnis des Gesamtausdrucks bereits fest steht:
http://en.wikipedia.org/wiki/Short_circuit_evaluation
Sehr nützlich für Abfragen wie deine und für vieles andere mehr!Nirvash schrieb:
Der Definition nach werden die logischen Ausdrücke innerhalb einer If-Bedingung von links nach rechts aus ausgewertet. Dennoch hab ich die Erfahrung gemacht, dass gerade solche Konstrukte ab und an zu Fehlern führen, weil anscheinend doch zuerst der rechte Ausdruck ausgewertet wurde. Daher hab ich mich entschieden soetwas zu vermeiden und für mich das Verhalten in solchen Situationen als undefiniert zu verbuchen.
Eventuell kann jemand mit mehr Erfahrung aber dazu auch etwas anderes sagen.
Du hast etwas falsch gemacht, das kann nicht sein. Das ist elementar. Das macht kein Compiler falsch.
-
Die Auswertungsreihenfolge ist garantiert, erst wird der linke Teil ausgwertet, dann der rechte.
(Es sei denn man überlädt operator &&, aber das ist ja in C (zum Glück?) nicht möglich)
-
Nirvash schrieb:
Der Definition nach werden die logischen Ausdrücke innerhalb einer If-Bedingung von links nach rechts aus ausgewertet.
Und hier hätte Dein Post zuende sein können.
Dennoch hab ich die Erfahrung gemacht, dass gerade solche Konstrukte ab und an zu Fehlern führen, weil anscheinend doch zuerst der rechte Ausdruck ausgewertet wurde.
Dann ist dein Compiler kaputt.
-
Tippe eher darauf, dass irgendwas mit meinem Code damals Grundsätzlich nicht in Ordnung war.