Lektion 46:

Fallstricke bei Operatoren

 Um Ihnen den Blick in diese Tabelle möglichst lange ganz zu ersparen, werden hier die beiden Besonderheiten aufgeführt, die Sie auswendig wissen sollten:

a) Der operator<< ist recht hoch angesiedelt. Insbesondere steht er vor den Vergleichen. Daher geht nicht

   cout<<5==5<<endl;

weil der Compiler dies als

   (cout<<5)==(5<<endl);

interpretiert. Dort müssen Klammern gesetzt werden.

   cout<<(5==5)<<endl;

b) && steht vor ¦¦

   monat==1 && tag<1¦¦tag>31

wird der Compiler lesen als

   (monat==1 && tag<1) ¦¦ tag>31

gemeint war aber vom Programmierer

   monat==1 && (tag<1¦¦tag>31)

c) verwechseln Sie nicht = mit ==

Eine Anweisung der Art

   if(schaltjahr=true)
      cout<<"Schaltjahr"<<endl;

wird Sie überraschen, denn für jedes Jahr wird "Schaltjahr" ausgegeben. Der Grund hierfür ist, daß die Zuweisung schaltjahr=true der Variablen schaltjahr den Wert true zuweist, und der Wert dieses Ausdrucks (der neue Wert von schaltjahr) ergibt true.

Es passiert also nichts anderes als in

   schaltjahr=true;
   if(true)
      cout<<"Schaltjahr"<<endl;

d) Im Allgemeinen ist der genaue Zeitpunkt, zu dem die Seiteneffekte ausgeführt werden nicht definiert! Zum Beispiel ist im Ausdruck

   i=++i+1

nicht definiert, ob zuerst die Zuweisung oder die Erhöhung um eins ausgeführt wird. Von dieser Ausführungsreihenfolge ist aber der neue Wert von i abhängig.



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