if in for-Anweisung
-
Beispielsweise so:
for(int i = 0; i < 100; i += (i%5 == 0) ? 2:1)Es gibt aber noch tausend andere Möglichkeiten, so etwas aufzuschreiben. Dies dürfte eine recht nachvollziehbare und gut abänderbare Möglichkeit sein.
Falls du es nicht kennst:
X ? Y : ZDieser Ausdruck hat den Wert Y, wenn X wahr ist und den Wert Z andernfalls.
-
3 Möglichkeiten fallen mir da ein:
1. Ternärer Operator:
for (int i = 0; i < 100; i += (i % 5 == 0) ? 2 : 1) { }2. Für dem Wahnsinn anheim Gefallene:
for (int i = 0; i < 100; i += 2 - std::min(i % 5, 1)) { }3. Einfach in den Schleifenkörper schreiben:
for (int i = 0; i < 100; ) { if (i % 5 == 0) i += 2; else i++; }Ich persönlich würde Variante 3 empfehlen. Es ist nichts verwerfliches dabei, das Hochzählen der Laufvariable im Schleifenkörper zu erledigen - besonders wenn es ein bedingtes Hochzählen ist. Ebenso fördert es die Lesbarkeit und macht deine Intentionen besser klar.
Gruss,
Finnegan
-
for( schleifenkopf ) { if( bedingung ) { dein code; } else { whatever; } usw; }
-
Vielen Dank für alle vorgeschlagenen Lösungen!
Da ich mich gerade durch die Anfänge von C++ und die auf dem Web zugänglichen Tutorials kämpfe, kannte ich den Ausdruck X ? Y : Z noch nicht. Klingt aber sehr elegant.
Die ganze if...else-Geschichte in den Schleifenkörper zu packen, kam mir auch schon in den Sinn; ich dachte aber, das sei eher "unelegant" oder verpönt, da ich in Programmbeispielen bisher immer nur die Inkrementierungsanweisungen im Schleifenkopf gesehen habe, besonders, wenn die Inkrementierungen einen regelmäßigen Charakter haben.
Aber ich lerne natürlich gern dazu

Nochmals besten Dank!
ds
-
ds schrieb:
Da ich mich gerade durch die Anfänge von C++ und die auf dem Web zugänglichen Tutorials kämpfe,
Es ist bis heute kein brauchbares C++-Tutorial im Netz bekannt. Tutorials werden meistens von fortgeschrittenen Anfängern geschrieben, wenn sie selber glauben, sie wären gut und müssten ihr Wissen mit der Welt teilen.
-
Es ist bis heute kein brauchbares C++-Tutorial im Netz bekannt.
1. Geh' auf amazon.de
2. Kauf' dir den Primer
-
SeppJ schrieb:
Es ist bis heute kein brauchbares C++-Tutorial im Netz bekannt. Tutorials werden meistens von fortgeschrittenen Anfängern geschrieben, wenn sie selber glauben, sie wären gut und müssten ihr Wissen mit der Welt teilen.
So was habe ich befürchtet, schon allein, weil es irgendwie "danach riecht", dass jeder Tutorial-Autor seine Weisheiten als die Alleingültigen darstellt, die Tutorials aber dennoch irgendwie Unterschiede aufweisen, obwohl sie sich auf gemeinsame Standards berufen.
Arcoth schrieb:
1. Geh' auf amazon.de
2. Kauf' dir den PrimerIch vermute, du meinst den von Stanley B. Lippman ?!
Gruß
ds
-
Finnegan schrieb:
2. Für dem Wahnsinn anheim Gefallene:
for (int i = 0; i < 100; i += 2 - std::min(i % 5, 1)) { }Nein Wahnsinn wäre sowas:
for (int i = 0; i < 100; [&i]{ if (i%5 == 0) i+=2; else ++i; }()) { // ... }EDIT: wobei man unten ja noch schnell nachvollziehen kann was das bedeutet / tut

-
Richtiger Wahnsinn geht so:
i += 2 - (i % 5 != 0)Alles andere brancht immer noch.
-
Es geht auch elegant:
for (int i = 0; i < 100; ++i) { if (i % 5 == 0) ++i; }
-
Finnegan schrieb:
3. Einfach in den Schleifenkörper schreiben:
for (int i = 0; i < 100; ) { if (i % 5 == 0) i += 2; else i++; }Ich persönlich würde Variante 3 empfehlen. Es ist nichts verwerfliches dabei, das Hochzählen der Laufvariable im Schleifenkörper zu erledigen - besonders wenn es ein bedingtes Hochzählen ist. Ebenso fördert es die Lesbarkeit und macht deine Intentionen besser klar.
coder777 schrieb:
Es geht auch elegant:
for (int i = 0; i < 100; ++i) { if (i % 5 == 0) ++i; }Finde ich die schlechteste Lösung:
for (int i = 0; i < 100; ++i) { machWasmitZBArray(a[i]); if (i % 5 == 0) ++i; unuebersichtlicherCode(); nach3MonatenIstAufgefallenDassAmEndeNochWasGemachtWerdenMuss(a[i]); // Bähm! }
-
Jockelx schrieb:
Finde ich die schlechteste Lösung:
Macht aber keinen Sinn. Wenn du Finnegans Code so einrahmen würdest, würde das genauso passieren (sogar eher).
Und wer weiß, vielleicht will man in a[i] sogar in dem Fall den um 1 erhöhten Wert zum Überspringen des Feldes. Da ist 1 oder 2 schlimmer.Der Punkt: Je weniger Zeilen, desto übersichtlicher.
-
Ich meinte sowohl Finnegans 3.Lösung als auch deine (mit dem selben Argument), als schlechteste Lösung.
Lohnt aber auch nicht wirklich darüber zu streiten.
Ich würde den Index jedenfalls wenn es irgendwie geht nur im Kopf ändern und nicht im Rumpf.
-
Was ist denn mit sowas hier?
for(int i = 0; i < N; i++) { if ( i%5 == 0 ) continue; // do shit... }
-
Skym0sh0 schrieb:
Was ist denn mit sowas hier?
for(int i = 0; i < N; i++) { if ( i%5 == 0 ) continue; // do shit... }Damit Jockelx keinen Code reinklemmen kann
for(int i = 0; i < N; i++) {if(i%5==0)continue; // do shit... }
-
for (int i = 0; i < N; i++) if (i % 5) DoShit();?
-
Uih.
"Ich möchte um x um 2 inkrementieren, wenn x durch 5 glatt teilbar ist, ansonsten soll um 1 inkrementiert werden."
gemacht zu
"Beispiel: ich möchte die nicht durch 5 teilbaren Zahlen haben."
Das gewinnt natürlich.