PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zu bool Ausdrücken in C++


Gast
2003-11-01, 01:27:51
bool ausdruck1 = !(4 == 3);
std::cout << ausdruck1 << std::endl; // 1

bool ausdruck2 = !4 == 3;
std::cout << ausdruck2 << std::endl; // 0


Warum kommt beim ersten Ausdruck 1 raus und beim zweiten 0?

Könnt ihr mir sagen wie die Ausdrücke ausgewertet werden?

Crushinator
2003-11-01, 02:03:29
Oh Gott!!!111eins, wo soll ich anfangen? :kratz2:

!(4 == 3) bedeutet das Gegenteil der Antwort auf die Frage "Ist 4 gleich 3?" -> Da 4 ungleich 3 ist, lautet das Ergebnis 0 (False) und das ergibt negiert 1 bzw. True.

!4 == 3 bedeutet wiederum das Ergebnis vom "Ist Gegenteil von 4 gleich 3?" -> Da 4 negiert in C immer 0 (False) bedeutet, lautet die Antwort auf "Ist 0 gleich 3?" auch False bzw. 0 :freak:

Mit anderen Worten: Ausdrücke in Klammern werden wie in der Mathematik zuerst ausgewertet und erst dann mit dem Operator weiterverarbeitet.

Vedek Bareil
2003-11-01, 20:18:34
also was crushinator eigentlich sagen will ;), ist: Negationsoperator ! hat eine höhere Priorität als der Vergleichsoperator ==, daher wird bei der zweiten Konstruktion zuerst 4 negiert und dann erst mit 3 verglichen.

Crushinator
2003-11-01, 20:39:54
Ganau, dieser ominöse crushinator hat nämlich auch noch vergessen zu präzisieren, daß ohne Klammer alle Operatoren einfach von links nach rechts nacheinander abgearbeitet werden und deshalb die o.g. Priorität zustande kommt. ;)

Demirug
2003-11-01, 21:03:51
Original geschrieben von crushinator
Ganau, dieser ominöse crushinator hat nämlich auch noch vergessen zu präzisieren, daß ohne Klammer alle Operatoren einfach von links nach rechts nacheinander abgearbeitet werden und deshalb die o.g. Priorität zustande kommt. ;)

Ich glaube da bist du auf einem Holzweg. Operatoren haben unterschiedliche Prioritäten.

Crushinator
2003-11-01, 23:17:57
^^ und zwar?

/edit: Ich meine abgesehen von der mathematisch vorherzusehenden Punkt vor Strich Geschichte, und bitte ein kleines Beispiel. *liebguck*

Xmas
2003-11-01, 23:44:31
Das einfachste Beispiel: a = b + c
Oder auch: a || b && c

http://www.cs.niu.edu/~abyrnes/csci241/precedence.htm

Crushinator
2003-11-02, 00:04:44
Danke, allerdings wäre es beim ersten ja auch wie in der Mathematik und daher selbstverständlich. Das zweite Ding ist deutlich besser und ich hätte vorher gewettet, daß dasselbe wie "(a || b) && c" rauskäme. Um es genau zu sagen: Mir war nicht bewußt, daß auch Vergleichs- bzw. logische operatoren verschiedene Prioritäten haben.

Jetzt habe ich auch noch das gefunden:
http://www.chakotay.de/c-kurs/html/anlagen.htm

*horizonterweiter*

bulla
2003-11-02, 22:22:15
Jo, das ist das Zielgebiet der Logik: Solche Aussagen zu standartisieren, damit nicht jeder Compiler macht, was er will.

Bei z.b. a->b->c ist nicht genau bestimmbar, was zuerst ausgeführt werden soll, also keine Priorität vorhanden.
Diese ist aber bei (a->b)->c bzw. a->(b->c) gegeben.

Definition (kleiner Logik-Exkurs :D):
1) "Nicht-Zeichen" bindet stärker als alle anderen Konnektoren, d.h., wobei "NichtZeichen = -",
(-p) und r = -p und r ungleich -(p und r)

2) "Und" und "oder" binden stärker als ->, <-

Xmas
2003-11-02, 22:50:23
Original geschrieben von bulla
Bei z.b. a->b->c ist nicht genau bestimmbar, was zuerst ausgeführt werden soll, also keine Priorität vorhanden.
Diese ist aber bei (a->b)->c bzw. a->(b->c) gegeben.

Öh, du redest jetzt aber nicht vom C++ operator->, oder?

bulla
2003-11-02, 23:16:15
nop
kenne das pointer-symbol gar nicht, bin java-geschädigt :)

GloomY
2003-11-03, 15:37:47
Imho ist false als 0 definiert und true als !=0 (ungleich Null). Daher muss beim ersten Beispiel nicht umbedingt Eins herauskommen, es kann genausogut auf 5 oder 17 dastehen ;)

Gast
2003-11-04, 01:07:45
Nö, denn << sollte eigentlich für bool überladen sein - ein vernünftiger Compiler würde true und false ausgeben.