C++ Simple do-while Schleife - warum sind integer-Zahlen krumm teilbar?

DJMadMax

Fleet Admiral Pro
✍️Leserartikel-Schreiber
Registriert
Mai 2007
Beiträge
19.072
Heyho,

das Problem ist eigentlich recht simpel. Es handelt sich um eine einfache do-while Schleife, die bei Durchlaufen einen Wert erhöht und bei Erreichen eines gewissen Werts stehn bleiben soll.

Die Bedingung sieht folgendermaßen aus:


i hat den Ausgangswert 3, j hat den Ausgangswert 0.

do {
++j;

if (i / 2)
{ --i;
}

else
{ i = i * 2;}
}
while (i < 8);

Sofern die Schleife korrekt durchlaufen würde, sollte für "j" der Wert 3 herauskommen (die Schleife läuft 3x durch, bis die Bedingung erfüllt wird).

Das Problem ist jedoch, dass der Code falsch interpretiert wird: "if (i/2)" <- leider meint devcpp, mit dem ich programmiere, dass ein Wert von 3 durch 2 teilbar wäre - und gibt als Ergebnis 1 heraus. Dies ist laut Dev nicht teilbar, weshalb eine 2 im zweiten Durchgang ausgegeben wird - und danach wieder ne 1, schon befindet sich das Programm in der Endlosschleife.

Die Frage nun: Wie kann ich den Code dazu bringen, dass korrekt unterschieden wird, wie eine Int-zahl ganzzahlig teilbar ist, bzw. eben nicht?

Thx im Voraus :)

Cya, Mäxl (dessen C-Zeiten schon über ein Jahr zurück liegen ^^)
 
if (i/2) testet nicht ob i durch 2 teilbar ist. Stattdessen führst du eine Ganzzahldivision durch deren Ergebnis (nämlich 1) als ein Wahrheitswert gedeutet wird (0 ist false, alles andere ist true).

Was du machen willst ist wohl if (i % 2 == 0) um zu überprüfen ob der Rest der Division 0 ist.
 
Bei einer Integer-Division ist 3 doch durch 2 teilbar, Ergebnis ist 1 Rest 1.

Nimm für die if - Schleife den negierten Rest der Division, dann sollte das passen:

if !(i % 2)
....
 
Zuletzt bearbeitet:
/ (Division)

Dividiert die Werte seiner zwei Operanden und gibt das Ergebnis zurück. Bei der Division von Ganzzahlen fällt ein eventueller Rest weg, wird also nicht gerundet.

--> 10/4=2
3/2=1
usw
 
Zurück
Oben