Division und Rest
-
@Lou-Cyphr3 sagte in Division und Rest:
Im übrigen wenn ich erst in Zweile 18 rechnen lasse, bekomm ich nen Error.
Könnte am Compiler liegen.Na dann probier's mal mit Zeile 15. Oder mit C++ Lernen
-
Okay danke . Ich habs jetzt. Ich bin jetzt den Weg über ungleich true gegangen.
-
Also ich fände ja
(a % b) == 0
deutlich besser zu lesen/verstehen. Ganz abgesehen davon dass Vergleiche mittrue
sowieso ... "gefährlich" sind.
-
@hustbaer sagte in Division und Rest:
.Ganz abgesehen davon dass Vergleiche mit
true
sowieso ... "gefährlich" sind.Echt? Das überrascht mich jetzt. Kannst du das näher erklären?
-
In C gilt der Wert 0 als falsch, alles andere als wahr. ( also auch 2 oder -12345)
false
ist 0
!false
(not false) alsotrue
ist 1123 % 10 = 3, also wahr. Aber der Vergleich mit
true
ist nicht erfolgreich.
-
Ein boolscher Wert ist schon entweder
true
oderfalse
, d.h. du brauchst nicht mehr zu vergleichen:cout << erg_div << endl;
-
@Lou-Cyphr3 sagte in Division und Rest:
@hustbaer sagte in Division und Rest:
.Ganz abgesehen davon dass Vergleiche mit
true
sowieso ... "gefährlich" sind.Echt? Das überrascht mich jetzt. Kannst du das näher erklären?
Man kann bei Refactorings leicht die Konvertierung nach
bool
übersehen.
Beispiel:bool foo = a % b; if (foo != true) { // ... }
Refactoring: "unnötige" Variable entfernen. Ergebnis:
if ((a % b) != true) { // ... }
Und schwupps haben wir ein gänzlich anderes Verhalten.
Im neuen Code wird jetzttrue
in einen Integer-Typ mit Wert 1 konvertiert, und dann mit dem Ergebnis vona % b
verglichen.
Im alten Code ist die Bedingung wahr wenna % b
gleich 0 ist. Im neuen Code ist die Bedingung wahr wenna % b
ungleich 1 ist.Weiters gibt es etliche APIs die einen wahr/falsch Wert als Integer zurückgeben - die WinAPI ist z.B. voll davon. Auch hier gilt dass 0 für
false
steht und alles andere fürtrue
. Und auch hier ist nicht sicher dass "alles andere" immer nur 1 ist - es kann irgend ein Wert ausser 0 sein.=> Mit
true
vergleichen ist potentiell gefährlich.Weiters ist es auch unnötig. Statt
if (x == true)
kann man genau so gutif (x)
schreiben und stattif (x != true)
kann manif (!x)
schreiben.
(Vorausgesetztx
ist ein Ausdruck dessen Wert vom Typbool
ist. Wenn der Typ nichtbool
ist macht es natürlich einen Unterschied - genau darum geht's ja.)Vergleiche mit
false
sind weniger problematisch, aber genau so unnötig.
-
Wenn man Spaß daran hat, kann man das sogar weiter treiben (schon so ähnlich im Code gesehen):
bool x; if (functionReturningBool() == true) x = true; else x = false; bool y = x ? true : false; if (y == true) { ... }
-
@hustbaer
Danke für die Ausführung.
Ich bin nur verwirrt weil ich heute explizit meinen Lehrer danach gefragt habe
und er nochmals fürtrue
undfalse
plädiert hat.
Ich frage mich gerade wann überhaupt bool einsetzten?
-
@Lou-Cyphr3 sagte in Division und Rest:
Ich frage mich gerade wann überhaupt bool einsetzten?
@hustbaer hat ja nicht gesagt, nie bool zu benutzen, sondern die Form des Vergleichs zu vermeiden, die du benutzt hast. Das ist ein ganz großer Unterschied.
Ich zitiere mich mal aus einem anderen Thread von heute: Ein Programm sollte sich wie ein Text lesen lassen.
Welcher Text klingt besser?
"Das Ergebnis ist wahr"
"Das Ergebnis ist gleich der Wahrheit"Generell ist bool aber offensichtlicherweise für die Dinge gut, für die es gemacht ist. Also Dinge, die wahr oder falsch sein können. Als Ergebnis einer Rechenoperation ist das ein ungewöhnlicher Einsatz. Das Ergebnis einer Rechenoperation ist in diesem Fall eine Ganzzahl und du möchtest wissen, ob diese ungleich 0 ist. Dann schreib das doch auch so! Die bool-Trickserei mag letztendlich zwar das gleiche erreichen, aber nur über komische Konvertierungen und es drückt dabei nicht deine Absichten aus. Im Maschinencode schreibt der Compiler am Ende sowieso immer den gleichen Code, aber nur wenn du deine Absichten klar ausdrückst, stellst du sicher, dass andere Menschen deinen Code gut verstehen können, und das dein Code robust gegen unerwartete Änderungen ist. Je klarer du dich ausdrückst, desto besser funktioniert das.
-
@Lou-Cyphr3
Wie @SeppJ schon geschrieben hat:bool
,true
undfalse
sind alle voll OK und ich verwende sie alle. Z.B.bool
Parameter/Variablen mit1
statttrue
zu befüllen wäre hochgradig bekloppt. Was ich nur nicht mache ist mittrue
oderfalse
zu vergleichen.
Und was ich auch nicht mache ist sowas wie...bool var = a % b;
...also implizite Konvertierung von einem Integer-Typ nach
bool
.
(Ausgenommen in bestimmten Fällen inif
Statements - aber das zu erklären würde jetzt zu weit gehen.)Unsere Compiler sind soger so eingestellt dass sie bei
bool var = a % b;
ne Warning werfen, und da wir mit "treat warnings as errors" bauen...