Einsendung:

short-cirquit-Auswertung?

Zum fiktiven Ausdruck

   (xy==1) && (ab==1)

Wird nun, wenn xy=2 ist, der Wert von ab noch kontrolliert, oder überspringt der Compiler den zweiten Teil, da der Ausdruck eh false wird?

 In C++ werden die logischen Operatoren nur so lange ausgewertet, bis das Ergebnis feststeht. Wenn xy==2, dann wird ab==1 gar nicht mehr getestet, weil false&&irgendwas immer false ergibt. Diese Art der Auswertung wird "short-cirquit-Auswertung" genannt.

Wären dann Konstrukte wie unter OPascal möglich wie

   if ((s!="") && (int(s)>5))

Zur Erklärung: Wäre s ein Leerstring würde die fiktive Umwandlungsfunktion int(s) einen Runtime-Error erzeugen.

Solche Konstrukte wären möglich. Leider geht in C++

   int(s) // Den string s in einen int umwandeln.

nicht. Ansonsten haben Sie aber völlig recht.
Wäre s=="", dann stände das Ergebnis bereits fest, den egal, was bei int(s)>5 rauskäme, der Ausdruck (s!="") && (int(s)>5) würde immer false ergeben.
Damit wird sozusagen der Aufruf von int(s) "geschützt". Der würde genau in dem Fall, da0 s=="" eine asserion auslösen.
Damals in C hat man so etwas noch sehr oft gesehen. Inzwischen hat sich aber durchgesetzt, solche komplizierten Sachen einfach zu vermeiden.
Statt

   if ((s!="") && (int(s)>5))
      ...

kann man nämlich gleichermaßen

   if (s!="")
      if(int(s)>5))
      ...

schreiben. In der zweiten Version sieht man viel deutlicher, daß s.top() nicht mehr aufgerufen wird, wenn s.empty()==false.



Falls Ihnen Fehler im Text auffallen oder Sie Verbesserungsvorschläge haben, dann schicken Sie mir bitte eine Mail. Ich werde mich dann sofort darum kümmern.
[aktuelle Version] [inhalt] [index]      [Fehlerkorrektur, Verbesserungsvorschlag]

© Volkard Henkel <volkard@normannia.de>, last update: 08/25/00