for loop - unerwartetes Verhalten
-
for(int i=0,j=0,k=0;i<20,j<30,k<40;++i,++j,++k) std :: cout << i << ' ' << j << ' ' << k << endl;
Das merkwuerdige ist, dass fuer alle 3 Variablen die Zahlen von 0 bis 39 ausgegeben werden.
Eigentlich muesste doch, wenn i==19 die Schleife abgebrochen werden.
Und was ist eigentlich das Aequivalent zu dieser Konstruktion
for(int i=0,j=0,k=0;i<20 || j<30 || k<40;++i,++j,++k) std :: cout << i << ' ' << j << ' ' << k << endl;
oder
for(int i=0,j=0,k=0;i<20 && j<30 && k<40;++i,++j,++k) std :: cout << i << ' ' << j << ' ' << k << endl;
oder etwas ganz anderes?
Man kann diese Schleifenkonstruktion doch nicht als Ersatz fuer
for(int i=0;i<20;++i) cout << i <<endl; for(int j=0;j<30;++j) cout << ' ' << j << endl; for(int k=0;k<40;++k) cout << " " << k << endl;
nehmen, oder?
thx in advance
-
Was du brauchst ist die && Bedingung, wie in dem dritten codekästchen.
-
Hi,
du unterliegst einem Irrtum, der Komma-Operator arbeitet anders.
for(int i=0,j=0,k=0;i<20,j<30,k<40;++i,++j,++k) std :: cout << i << ' ' << j << ' ' << k << endl;
entspricht:
for(int i=0,j=0,k=0;k<40;++i,++j,++k) std :: cout << i << ' ' << j << ' ' << k << endl;
MfG Eisflamme
-
Hi,
man sollte die "Weitermachbedingung" mit den logischen Operatoren verknüpfen. Dann ist ja völlig klar, wielang der macht. Wenn du dann mit Oder (||) verknüpfst, macht der solange, bis die höchste Bedingung überlaufen wird (k<40), weil ja nur eine der vergleiche wahr ergeben muss. Bei und (&&) bricht der ab, sobald eine Bedingung nicht mehr wahr ist, also i<20.
Das was du als letztes schreibst, ist natürlich nicht äquivalent zu einer Schleife.
Mata
-
@Mis2com
Schwachfug! Es gibt keinen operator ,!Operatoren hängen mit Objekten zusammen und nicht mit sowas!
-
selbstverständlich ist , ein operator, den man auch beliebig überladen kann, wenn man es braucht - er hat allerdings den geringstens rang aller operatoren
der sequential-operation operator wertet jeden ausdruck von links nach rechts aus (in C ist ein sequence point nach jedem ausdruck); der wert des comma operators ist demzufolge das ergebnis des ausdrucks, der ganz rechts steht, hier also k<40
für das ergebnis des operators ist also völlich egal, was vor dem letzten ausdruck passiert ... man kann sich aber darauf verlassen dass der linke ausdruck zuerst (einschliesslich aller seiteneffekte) ausgewertet wird
-
SeraphLinux schrieb:
@Mis2com
Schwachfug! Es gibt keinen operator ,!Operatoren hängen mit Objekten zusammen und nicht mit sowas!
Schnauze halten wenn man keine Ahnung hat.
[cpp]expression1,expression2, /.../ ,expressionn[/cpp]
expression1 wird ausgewertet, dann expression2, und so weiter bis expressionn und das ganze nimmt dann den Wert von expressionn an.