Frage zu if()
-
Hallo,
ich lese gerade wieder mal im Primer und da ist mir aufgefallen, dass dort folgendes gemacht wird, natürlich mit ein wenig mehr Sinn
:int integer; std::cin>>integer; if(integer) return 10/integer; else return 0;Ich verstehe dieses so, dass sie nicht wollen, dass durch 0 geteilt wird.
Nur dachte ich immer, dass:if(integer) = if(integer == 1) und if(!integer) = if(integer == 0)Nur kann dies ja nicht mehr sein, es muss (nach dem Primer
) so heißen:if(integer) = if(integer != 0) oder if(integer) = if(integer > 0)Habe ich immer falsch gelegen oder bin ich einfach nur ein wenig durcheinander gekommen?
Gruß Speedy_92
-
false = 0
true = alles andere
-
Vielen Dank.
Ist true auch negativ?
-
Speedy_92 schrieb:
Vielen Dank.
Ist true auch negativ?Ja.
-
Einerseits werden (schon nur aus C-Kompatibilität) alle integralen Werte ausser 0 als
trueaufgefasst, wenn es um einen boolschen Ausdruck geht. Andererseits, wenn du explizittrueschreibst, z.B. so:long i = true;, dann wird für
trueder Wert 1 eingesetzt.trueist also genau genommen nicht negativ, aber Negatives kanntruesein
-
Nexus schrieb:
Einerseits werden (schon nur aus C-Kompatibilität) alle integralen Werte ausser 0 als
trueaufgefasst, wenn es um einen boolschen Ausdruck geht. Andererseits, wenn du explizittrueschreibst, z.B. so:long i = true;, dann wird für
trueder Wert 1 eingesetzt.trueist also genau genommen nicht negativ, aber Negatives kanntruesein
Den Spruch merke ich mir

-
Genau das ist es was man verstehen muss.
Erst einmal wird 0 und 1 definiert als Wahrheitswert.
0 = Strom aus = False
1 = Strom ein = TrueDas Problem bei der Prüfung ist hier natürlich, das man nur auf 0 und 1 testen könnte.
Man sagt also (Definition) das 0 = False und !0 = True ist.
-5 ist < 0. Das heißt doch, es ist ungleich 0, und somit wahr.
Die Rückgabe der Auswertung als Wahrheitswert folgt nach der Definition.Doch Vorsicht bei unterschiedlichen Datentypen (explizite Umwandlung)
int a = -1; unsigned int b = 0; if(b < a) { // b ist der Operand der verglichen werden soll mit a // a wird somit umgewandelt nach unsigned int // -1(int) nach uint ergibt uint(max) [Überlauf] }
-
Versuch einfach if (integer) zu vermeiden. Mach es explizit und du bist immer auf der sicheren Seite.
-
Ponto schrieb:
Versuch einfach if (integer) zu vermeiden. Mach es explizit und du bist immer auf der sicheren Seite.
Würde ich auch raten. Wahrscheinlich wird das eh rausoptimiert, wenn man noch ein
!= 0hineinschreibt, im Gegenzug weiss man gerade, dass es um einen Vergleich von Ganzzahlen geht.Bei dem hier sollte man eigentlich eine Warnung erhalten:
int a = -1; unsigned int b = 0; if(b < a) // ...