Gültigkeitsbereich von Variablen in for Schleifen



  • Bei der MFC ist sowas üblich. Deswegen kann es vielleicht sein, dass auch modernere MS-Compiler das noch untestützen.
    Bei meinem BCB5 ist das über die Compilereinstellungen steuerbar. Das dazugehörige Flag heißt dort MFC-Kompatibilität.
    Vielleicht gibts ja sowas auch bei dir.



  • das ist schon okay so; das a in der zweiten for-schleife, ist ein neudeklariertes; steht also nicht im zusammenhang mit dem a aus der for-schleife eins.



  • Wo ist das a in der zweiten Schleife neu deklariert worden ?



  • ne ne ne schrieb:

    das ist schon okay so; das a in der zweiten for-schleife, ist ein neudeklariertes; steht also nicht im zusammenhang mit dem a aus der for-schleife eins.

    Genau darum geht es ja: der Bezeichner a dürfte in der zweiten schleife gar nicht bekannt sein...


  • Mod

    um ms vc .net zu heilen:
    entweder /Za (für error) oder/Zc:forScope (dann gibts nur ne warnung i.V.m. /Ze)



  • finix schrieb:

    ne ne ne schrieb:

    das ist schon okay so; das a in der zweiten for-schleife, ist ein neudeklariertes; steht also nicht im zusammenhang mit dem a aus der for-schleife eins.

    Genau darum geht es ja: der Bezeichner a dürfte in der zweiten schleife gar nicht bekannt sein...

    Vergiss was ne ne ne gesagt hat. a wird in der zweiten Schleife weder deklariert noch definiert. Wenn dem so wäre, würde sich der MSC nämlich wegen dem for Bug beschweren. Früher hat man iirc folgenden Workaround benutzt

    #define for if (0) {} else for
    

    Mittlerweile gibts ja das von camper angesprochene Compilerflag /Zc:forScope.



  • Soweit ich weiß, sind variablen die im Kopf der For-Schleife deklariert werden auch ausserhalb der klammern gültig, weil sie nicht im For-Konstrukt definiert werden!

    so wäre ihr Scope nur für die eine:

    {
     for(int a.....
     {
     }
    }
     for...
    

    Zitat aus einen Tutorial:

    Schleifen: for-Schleife (3/9)
    Zum anderen kann man die Variable(n) direkt im Initialisierungsausdruck deklarieren und definieren: 
      // Möglichkeit II: innerhalb des Initialisierungsausdruckes 
    
      for(int k=0; k<6; k++) 
      { 
      ... 
      }; 
    
    Man könnte nun aufgrund der Notation auf den Gedanken kommen, daß die zweite Möglichkeit die bessere sei, da nun k eine lokale Variable sei. Letzteres ist aber gerade nicht der Fall! Zu beachten ist nämlich, daß die im Initialisierungsausdruck deklarierten Variablen keine lokale Variablen sind, sondern auch außerhalb der Schleifenkonstruktion noch bekannt sind: 
    
      for (int k = 0; k < 6; k++) 
          cout << "k hat den Wert " << k << endl; 
    
      cout << "k hat den Wert " << k << endl;    // OKAY: k ist auf gleicher Ebene wie for-Schleife bekannt 
    
    Dieses liegt daran, daß der Initialisierungsausdruck genaugenommen vor dem Eintritt in die for-Schleife ausgeführt wird. D.h. die dort stattfindenden Anweisungen finden nicht innerhalb des for-Konstruktes statt, sondern außerhalb. Die Deklaration der Variablen steht damit auf gleicher Ebene wie die for-Struktur. Und damit unterscheiden sich die obigen beiden Möglichkeiten zumindest nicht in Bezug auf den Gültigkeitsbereich der Zählvariable.
    

  • Mod

    Zitat aus einen Tutorial:

    ab auf den müll damit 😉



  • > Soweit ich weiß, sind variablen die im Kopf der For-Schleife deklariert werden auch ausserhalb der klammern gültig

    das ist aber nicht Standardkonform! (ich liebe dieses Wort 😉

    das war früher mal so - aber ANSI/ISO/IEC oder wie auch immer Standard ändert sich von Zeit zu Zeit



  • du bist gar kein Camper sonder ein Rusher 😉



  • 5er1al schrieb:

    Soweit ich weiß, sind variablen die im Kopf der For-Schleife deklariert werden auch ausserhalb der klammern gültig

    Damit liegst du falsch.

    Zitat aus einen Tutorial:
    [Zitat gelöscht, da blödsinn]

    Der C++ Standard begrenzt den Gültigkeitsbereich von Variablen die im init-Statement einer for-Schleife deklariert werden auf die Schleife selbst und nicht darüber hinaus. Nachzulesen unter 6.5.3 The for statement


  • Mod

    Vertexwahn schrieb:

    du bist gar kein Camper sonder ein Rusher 😉

    psssst! 🙂



  • Aber wieso wird das dann in einem Tutorial einer Uni ausgiebig geschrieben...?



  • hast aber recht 🙂



  • Braunstein hat recht, für Visual C++ ist das einfach üblich,
    hab das auch in "C++ in 21 Tagen" (Jesse Liberty) gelesen.

    MfG RoaN;



  • beim dev-C++ mit g++ compiler schreibt er folgendes:

    main.cpp: In function `int main(int, char**)':
    
    main.cpp:15: error: name lookup of `a' changed for new ISO `for' scoping
    main.cpp:8: error:   using obsolete binding at `a'
    

    finds arg das visual studio net 2003 da keinen error oder waring schreibt, ja man kann nur hoffen das es beim visual studio 2005 besser wird;-)

    cu



  • roan312 schrieb:

    Braunstein hat recht, für Visual C++ ist das einfach üblich

    Was aber völlig irrelevant ist. In diesem Forum geht es nicht um Visual C++ (bzw den entsprechenden Compiler), sondern um (ISO) C++. Und genau nach dieser C++ Standard Konformität hat Vertexwahn ja gefragt.

    cplusplus_ schrieb:

    finds arg das visual studio net 2003 da keinen error oder waring schreibt

    Hast du dir die Beiträge überhaupt durchgelesen? Natürlich meckert der Compiler, du musst nur die Flags entsprechend einstellen.



  • > finds arg das visual studio net 2003 da keinen error oder waring schreibt, ja man kann nur hoffen das es beim visual studio 2005 besser wird;-)

    ...? sieh dir doch die Antworten an

    1. Man kanns doch ganz einfach umstellen
    2. Es wurde für die Aufwärtkompatibilität der MFC gemacht


Anmelden zum Antworten