for-schleife
-
Original erstellt von CodeWalker:
also: wenn du "i" IN der Schleife deklarierst, sollte "i" NACH der Schleife eh undefiniert sein (bei MSVC ist das wohl nicht so, aber das ist nicht Standard).
Ansonsten hat "i" nach der Schleife doch den Wert 5 ?!?!?Das stimmt, der Standard besagt:
int i = 10; for(int i = 0; i < 100; ++i) { array[i] = 0; } int j = i; // j ist 10
Der MSVC hält sich aber nicht daran
-
[ Dieser Beitrag wurde am 01.04.2003 um 13:26 Uhr von MaSTaH editiert. ]
-
Habs gefunden:
Des Rätsels Lösung ist:1 The for statement for ( for-init-statement conditionopt ; expressionopt ) statement is equivalent to { for-init-statement while ( condition ) { statement expression ; } }
EDIT: Also gibt es 5 wie Volkard sagt
[ Dieser Beitrag wurde am 01.04.2003 um 13:25 Uhr von MaSTaH editiert. ]
-
Original erstellt von MaSTaH:
**Das stimmt, der Standard besagt:int i = 10; for(int i = 0; i < 100; ++i) { array[i] = 0; } int j = i; // j ist 10
Der MSVC hält sich aber nicht daran**
ups.
bool iAmBuggy() { int i = 10; { for(int i = 0; i < 100; ++i) ; return i!=10; } } int j = i; // j ist 10
ps: wie würdest du hier deine { setzen?
so?
bool iAmBuggy() { int i = 10; { for(int i = 0; i < 100; ++i) ; return i!=10; } } int j = i; // j ist 10
das nach dem int i = 10; stört mich. und es runterzunehmen wäre inkonsequent. macht ihr keine blöcke, nur um variablen lokaler zu machen?
[ Dieser Beitrag wurde am 01.04.2003 um 13:34 Uhr von volkard editiert. ]
-
Der MSVC meldet aber beim kompilieren AFAIK eine redefinition
-
ist i global, so hat sie den wert 5 nach endgültigem abarbeiten der schleife.
ist i lokal (in der schleife), so hat sie den wert 4 nach endgültigem abarbeiten der schleife.????
muss ich bei bedarf mal ausprobieren.
-
Original erstellt von <i==5>:
**ist i global, so hat sie den wert 5 nach endgültigem abarbeiten der schleife.
ist i lokal (in der schleife), so hat sie den wert 4 nach endgültigem abarbeiten der schleife.????
muss ich bei bedarf mal ausprobieren.**
Ne, wenn i = 0 die Ausgangssituation war dann hat sie in beiden Fällen nachher den Wert 5
Aus:
for(int i = 0; i < 5; ++i) //...
Macht der MSVC intern (anscheinend):
int i = 0; for(; i < 5; ++i) //...
Deshalb ist i nachher noch vorhanden, da es nicht innerhalb der Schleife erstellt wurde...
-
ist i lokal (in der schleife), so hat sie den wert 4 nach endgültigem abarbeiten der schleife
Nein! Ist "i" lokal, existiert es nach der Schleife nicht mehr, ist also undefiniert!
Bei MSVC ist es anders (nicht Standard-konform), aber auch hier hat "i" nach der Schleife den Wert 5 !
-
Original erstellt von CodeWalker:
Nein! Ist "i" lokal, existiert es nach der Schleife nicht mehr, ist also undefiniert!
Bei MSVC ist es anders (nicht Standard-konform), aber auch hier hat "i" nach der Schleife den Wert 5 !GEnau das habe ich gerade geschrieben
-
Original erstellt von MaSTaH:
**Ne, wenn i = 0 die Ausgangssituation war dann hat sie in beiden Fällen nachher den Wert 5Aus:
for(int i = 0; i < 5; ++i) //...
Macht der MSVC intern (anscheinend):
int i = 0; for(; i < 5; ++i) //...
Deshalb ist i nachher noch vorhanden, da es nicht innerhalb der Schleife erstellt wurde...**
kommt auf den compiler an. ist nicht gerade berauschend, dass dein compiler dir andere ergebnisse liefert als meiner.
hab devc++.
Ne, wenn i = 0 die Ausgangssituation war dann hat sie in beiden Fällen nachher den Wert 5
ich denke nicht. lokal i muss bei der bedingung i=0; i<5 nachher auf 4 stehen.
beispiel:
int array[5]; for(int i=0; i<5; i=i+1) array[i]=i;
-
Original erstellt von MaSTaH:
Der MSVC meldet aber beim kompilieren AFAIK eine redefinitiondoch.
int i; for(int i;...
ist fehler bei dem. deshalb dachte ich, es sei nicht möglich, zweideutige sachen zu machen. aber es geht, wie meine funktion oben zeigt, mit nem block mehr.
-
ich denke nicht. lokal i muss bei der bedingung i=0; i<5 nachher auf 4 stehen.
beispiel:
int array[5];
for(int i=0; i<5; i=i+1)
array[i]=i;Nochmal zum Mitschreiben: i ist nach der Schleife nicht defininert, kann also JEDEN BELIEBIGEN Wert haben !!!
-
Original erstellt von volkard:
ist fehler bei dem. deshalb dachte ich, es sei nicht möglich, zweideutige sachen zu machen. aber es geht, wie meine funktion oben zeigt, mit nem block mehr.Jo, mit nem Block mehr geht es...
-
Original erstellt von CodeWalker:
Nochmal zum Mitschreiben: i ist nach der Schleife nicht defininert, kann also JEDEN BELIEBIGEN Wert haben !!!Auf welche Beiträge antwortest du??? 20 Mal auf den selben??? Wenn i nicht definiert ist kann es auch keinen Wert haben...
Außerdem geht es gerade um den MSVC... Laut Standard hast du ja recht. Wurde aber auch schon vor ner halben STunde so gepostet...
-
@Mastah: wenn du den Thread mal durchliest, siehst du, daß "i==5" es immer noch nicht verstanden hat....
-
Original erstellt von CodeWalker:
@Mastah: wenn du den Thread mal durchliest, siehst du, daß "i==5" es immer noch nicht verstanden hat....Das war aber vor ner halben STunde. In der Zwischenzeit wurde es schon erklärt...
-
es war in seinem letzten Beitrag um 13:41.... aber es ist mir irgendwie zu doof, mich mit dir darüber zu zanken
-
Original erstellt von CodeWalker:
es war in seinem letzten Beitrag um 13:41.... aber es ist mir irgendwie zu doof, mich mit dir darüber zu zankenAso, den habe ich nicht übersehen, sorry... Hatte nur den um 13:32 im Hinterkopf
-
Original erstellt von CodeWalker:
Nochmal zum Mitschreiben: i ist nach der Schleife nicht defininert, kann also JEDEN BELIEBIGEN Wert haben !!!Falsch! Es ist nach Standard falsch!
Wenn Du so unflexibel bist, über nen realexistierenden compiler nachzudenken, biete ich dieses ersatzproblem an:int array[5]; int i=0; for(; i<5; i=i+1) array[i]=i;
Alle bleiben bei dem alten Problem, CodeWalker nimmt das neue, und keiner bemerkt den Unterschied.
-
@Volkard:
Ich lese hier oft genug, daß es in diesem Forum um den Standard geht. Außerdem habe ich bereits in meinem 1. Posting darauf hingewiesen, daß sich MSVC anders verhält. Wenn sich ein Compiler nicht nach Standard verhält, ist das in meinen Augen falsch - was findest DU nun daran falsch, daß ich das "falsch" nenne???
Ich deklariere Schleifenvariablen immer vor der Schleife, weil ich dieses Fehlverhalten von MSVC zufällig kenne. Wenn du das anders machst, ist das deine Sache und nicht mein Problem. Schließlich wirst du die Fehler suchen müssen, die zwangsläufig entstehen werden, sobald du mit einem Compiler arbeitest, der Standard-konform ist.
Falls Du irgendwo in diesem Thread etwas von mir lesen kannst, was sachlich nicht richtig ist, zitiere mich bitte.