for-Schleife so sinnvoll ?
-
Hallo,
ich habe mal eine Grundsätzliche Frage zur C/C++-Syntax, genauer: Zur
Definition der for-Schleife:
Würde es nicht mehr Sinn machen, wenn der Gültigkeitsbereich einer in den
"for-Klammern" definierten Laufindexvariable nur der Schleifenrumpf wäre?Mal ein paar Beispiele...
Angenommen, ich habe ein Programm, das mehrere Schleifendurchläufe
nacheinander beinhaltet. Demnach müsste ich jetzt jedes mal einen neuen
Bezeichner für den Laufindex verwenden, da ansonsten eine Neudefinition
stattfindet. Folgendes geht nicht://CODE int main() { for (int i=0;i<10;++i) { //Anweisungen } for(int i=0;0<5;++i) { //Anweisungen } return 0; }
Dieses Problem lässt sich jetzt auf diverse Arten umgehen, z.B. indem die
Schleifen in Blöcken schreibe -> auf Dauer umständlich://CODE int main() { { for (int i=0;i<10;++i) { //Anweisungen } } { for(int i=0;0<5;++i) { //Anweisungen } } return 0; }
Ansonsten könnte man noch den Laufindex "globaler" gestalten, was ich
persönlich nicht sehr schön finde - eine globale Variable mehr (OK, man
könnte dann wieder einen Block darum setzen...)://CODE int main() { int i=0; for (i=0;i<10;++i) { //Anweisungen } for(i=0;0<5;++i) { //Anweisungen } return 0; }
Oder man verzichtet halt ganz auf die for...
Wäre es denn da nicht komfortabler, wenn die Syntax vorsehen würde, dass
eine in einer for-Schleife definierte Variable wirklich nur im
Schleifenrumpf gültig wäre ?
Oder eventuell sogar als Funktion implementiert, die jeweils den aktuellen
Wert des Laufindex zurückgibt ?Gruß
E-the-Real
-
Hi,
standardmäßig ist alles zwischen "for(" und ";...;...)" nur im Schleifenrumpf gültig.
Visual C++ 6.0 hält sich hier aber mal wieder nicht an den Standard, ich weiß ja nicht, welchem Compiler du verwendest.MfG Eisflamme
-
Warum soll dieser Code nicht gehen?
Oder hast du zufällig VC6. Ich glaube, ich habe da mal was gehört, dass er da etwas nicht nach Standard regelt.
(mein g++ packt es)://CODE int main() { for (int i=0;i<10;++i) { //Anweisungen } for(int i=0;0<5;++i) { //Anweisungen } return 0; }
Edit: 2 Sätze entfernt
Edit 2: zu spät
-
#define for if(0){}else for
und gut ist[edit]for vergessen[/edit]
-
Außerdem macht man kleine Funktionen.
-
Mis2com schrieb:
Visual C++ 6.0 hält sich hier aber mal wieder nicht an den Standard...
Quietsch bum paaaaaaf.... *totalcrash*
Du hast mal wieder Keine Ahnung von dem was Du Laberst.
http://boost.sourceforge.net/regression-logs/
VC++6.0 unterstützen nur den C89 Standard und die .NET Reihe erst den C99 Standard und da ist das erst gültig mit dem Doppelfor mit i.
-
Visual C++ 6.0 hält sich hier aber mal wieder nicht an den Standard
Das ist nicht ganz richting. Im ANSI compatibility mode (/Za) läßt sich obiger Code sehr wohl übersetzen.
Das war m.E. die richtige Entscheidung, da bei "altem" C++ (vor dem ANSI-Standard) der Scope der Laufvariable eben außerhalb der Schleife lag. Und es läßt sich (zugegebenermaßen mieser) Code konstruieren, der bei dieser Änderung nicht mehr funktioniert, ohne daß der Compiler eine echte Chance hätte, das zu melden.
[edit]ok, nitr vor-Standard, sondern alt-standard-code
[/edit]
-
#define for if(0){}else for
-
nix da schrieb:
VC++6.0 unterstützen nur den C89 Standard und die .NET Reihe erst den C99 Standard und da ist das erst gültig mit dem Doppelfor mit i.
Bist du dir bewusst, dass wir im C++ Forum sind?
Bist du dir bewusst, dass "for(int i; i<10; ++i)" kein legales C89 ist?
-
wieso nicht einfach:
int i=0
for(i=0; i<10; ++i)
{}
for(i=0; i<5; ++i)
{}
-
nix da:
Langsam wird es lächerlich.khg:
Nagut, das wäre natürlich auch eine Möglichkeit.MfG Eisflame
-
@Mis2com: ich find es ja lächerlich, jedesmal vor dem heiligen Standard einen Kniefall zu machen, und alle scheinbar abtrünnigen zu prügeln - aber das scheint heir ja so üblic hzu sein....
-
peterchen schrieb:
@Mis2com: ich find es ja lächerlich, jedesmal vor dem heiligen Standard einen Kniefall zu machen, und alle scheinbar abtrünnigen zu prügeln - aber das scheint heir ja so üblic hzu sein....
Stimmt - da ist ein Kniefall vor dem heiligen Microsoft natürlich besser.
Hast du den Thread gelesen??
-
Ja, ich habe in der Tat MSVC 6.0, aber mit welcher Begründung sollte denn der Compiler in diesem Fall vom Standard abweichen ? Das ist doch sinnlos...
-
khg schrieb:
wieso nicht einfach:
int i=0
for(i=0; i<10; ++i)
{}
for(i=0; i<5; ++i)
{}
siehe meinen Code, drittes Beispiel: ist mir zu global.
-
ethereal schrieb:
Ja, ich habe in der Tat MSVC 6.0, aber mit welcher Begründung sollte denn der Compiler in diesem Fall vom Standard abweichen ? Das ist doch sinnlos...
klar, vorallem dann sinnlos, wenn es compilerfehler beim portieren gibt.
Sowas nervt. Das hat doch nix mit 'Standard huldigen' zu tun - der Code ist einfach dann MS spezifisch und kompiliert nur dort bzw. legaler Code wird nicht angenommen.
Aber klar - der Standard liegt falsch und MS ist das einzig ware.
-
Wenn der VC 6.0 dafür eine Option besitzt, dann ist doch alles in Ordnung
Ansonsten benutzt man den Hack von Shade damit gehts ja auch
-
@Shade:
Wieso so kompliziert?
Wieso nicht einfach:#define for if(true) for
-
@SirLant:
Nö, hat er nicht.dEUs schrieb:
Wieso so kompliziert?
Wieso nicht einfach:#define for if(true) for
einziges Problem:
if(foo) for(...) bla(); else foobar();
und schon ist das ergebnis n bisschen komisch.
-
Shade Of Mine schrieb:
@SirLant:
Nö, hat er nicht.peterchen schrieb:
Visual C++ 6.0 hält sich hier aber mal wieder nicht an den Standard
Das ist nicht ganz richting. Im ANSI compatibility mode (/Za) läßt sich obiger Code sehr wohl übersetzen.
Ich hab kein VC 6.0 mehr, aber ich denke mal, dass Peterchen sich das nicht eben aus den Fingern gesaugt hat.