logischer Fehler mit Fragezeichenanhang ?
-
Hallo liebe Programmierer,
Ich bin bei einem Programm auf einen logischen Fehler, der Folgen im Programmablauf hatte gestoßen, konnte aber nicht den Grund dafür richtig zuordnen. Hier ein vereinfachtes Beispiel, welches genau den Fehler und das was der Compiler dabei macht enthält:#include<iostream> using namespace std; main(){ int size=0; if (size<=200 & size > 1) { size=200; } cout<<"size hat den Wert : "<<size<<"und die Adresse : "<<&size<<endl; size=10; if (size<=200 & size > 1) { size=200; } cout<<"size hat den Wert : "<<size<<"und die Adresse : "<<&size<<endl; return 0; }
Die Ausgabe:
x@xHP-Compaq-8200-Elite-CMT-PC:~/c++/basics$ ./a.out size hat den Wert : 0und die Adresse : 0x7fff8d746f2c x@xHP-Compaq-8200-Elite-CMT-PC:~/c++/basics$ g++ logical_error.cpp x@xHP-Compaq-8200-Elite-CMT-PC:~/c++/basics$ ./a.out size hat den Wert : 0und die Adresse : 0x7ffca3c0d20c size hat den Wert : 200und die Adresse : 0x7ffca3c0d20c x@xHP-Compaq-8200-Elite-CMT-PC:~/c++/basics$
Mein Problem ist einfach, dass die Abfrage mit :
if (size<=200 & size > 1) { size=200; }
mit & "eigentlich" doch ein syntax error waere da es && heißen muesste aber
der compiler es trotzdem richtig macht. Ich habe mir überlegt ob das & vom compiler zusammen mit dem >1 als Rechenoperation in Bitarithmetik interpretiert
wird ? aber damit konnte Ich es nicht verstehen, da der compiler es ja im 2 Fall richtig macht...
Kann der compiler den Fehler & statt && intern korrigieren ? ergibt für
micht auch keinen Sinn, da & in c++ der Adressoperator ist ?
-
Wir haben unäre und binäre Ausdrücke
-
Kai2777 schrieb:
Ich habe mir überlegt ob das & vom compiler zusammen mit dem >1 als Rechenoperation in Bitarithmetik interpretiert
wird ? aber damit konnte Ich es nicht verstehen, da der compiler es ja im 2 Fall richtig macht...
Kann der compiler den Fehler & statt && intern korrigieren ? ergibt für
micht auch keinen Sinn, da & in c++ der Adressoperator ist ?Ja, & ist der Operator für bitweises Und. So wird es auch interpretiert. Warum soll der Compiler es nicht richtig machen? Im zweiten Fall ist
size<=200 == true == 1 (a) size > 1 == true == 1 (b) 1 (aus a) & 1 (aus b) == 1 == true
Passt doch?
& wird nicht intern zu && umgewandelt. Und mit dem Adressoperator hat das ebenfalls gar nichts zu tun.
-
Danke an wob !,
habs glaube verstanden, die beiden Ergbnisse des ersten und zweiten Ausdrucks erzeugen mit & verknüpft ein true in der if ( 1 & 1 ) ---> ( true ) und somit geht er in die geschweiften Klammern ...
-
Du musst halt mal z.B. bei https://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence vorbeischauen. Die Vergleichsoperatoren <= und > binden stärker (Precedence
als das binäre & (Precedence 10).
Wenn man vorher öfter mal z.B. in Pascal gearbeitet hat, kann das sehr verwirrend sein, da dort AND deutlich stärker bindet.
-
Danke