Scope der While-Schleife



  • Hi,

    wird der Scope der While-Schleife verlassen, wenn die Bedingung geprüft wird? Den Ausgaben zufole eigentlich nicht. Dies könnte aber auch an Optimierungsgründen liegen.

    int i = 0 ;
    
    while(i++ < 2)
    {
    	cout << "vor Initialisierung: " << endl ;
    
    	int a ; // Deklaration
    	cout << "vor Initialisierung: " << endl ;
    	cout <<	"a = " << a << " address = " << &a << endl << endl ;
    
    	a = 6 ; // (Re-)Initialisierung
    
    	cout << "nach Initialiserung: " << endl ;
    	cout <<	"a = " << a << " address = " << &a << endl << endl ;
    }
    
    /*
    vor Initialisierung:
    a = -858993460 address = 001FFA84
    
    nach Initialiserung:
    a = 6 address = 001FFA84
    
    vor Initialisierung:
    a = 6 address = 001FFA84
    
    nach Initialiserung:
    a = 6 address = 001FFA84
    */
    

    MfG,
    WilMen



  • Ja, der Gültigkeitsbereich endet wie bei jedem Block bei der schliessenden geschweiften Klammer. Da du auf dem Stack arbeitest, wird das oberste Element a gepopt und im neuen Durchgang wieder gepusht, deshalb hat es die gleiche Adresse.



  • Hi Nexus!

    Wenn ich dem Visual C++ Debugger Glauben schenke, dann bleibt "a" deklariert. Nicht deklarierte Variablen werden transparent angezeigt, "a2 wird aber die ganze Zeit über wie eine globale Variable angezeigt, wenn ich es "überwache". Fasst der Debugger "a" als durchgehend deklariert auf, weil es immer die gleiche Adresse bekommt?

    MfG
    WilMen


  • Administrator

    @WilMen,
    Laut Standard sieht der Scope der while Schleife so aus:
    "6.5.1 The while statement" Abschnitt 2

    label:
    { // Start of while scope
    
      /* was auch immer im Kopf steht */
    
      if(/* Resultat im Kopf */)
      {
        // Inhalt der While-Schleife.
        goto label;
      }
    
    } // End of while scope
    

    Du kannst sowas sehr einfach auch selber prüfen:

    #include <string>
    #include <iostream>
    
    class ScopeLog
    {
    private:
      std::string m_name;
    
    public:
      ScopeLog(std::string const& name)
        : m_name(name)
      {
        std::cout << "C-Tor: " << m_name << std::endl;
      }
    
      ~ScopeLog()
      {
        std::cout << "D-Tor:" << m_name << std::endl;
      }
    };
    
    int main()
    {
      int i = 0;
      while(i < 5)
      {
        ScopeLog log("In While");
        ++i;
      }
    
      return 0;
    }
    

    Grüssli



  • Danke Dravere!

    Sehr gutes Beispiel, jetzt bin ich überzeugt!

    MfG WilMen



  • Nur noch zum anmerken. Du kannst Scopes auch ganz von irgendwelchen anderen Konstrukten abgelöst haben..

    Um mich mal an Draveres Beispiel zu hängen:

    int main()
    {
      int i = 0;
    
      { 
        ScopeLog log("Einfach ein Scope");
        ++i;
      } // log wird zerstört
    
      return 0;
    }
    

    wirkt komisch, findet allerdings durchaus Verwendung



  • Hi drakon!

    Danke, aber das wusste ich! Ich fand es nur komisch, dass der Scope beim Abfragen der Bedingung verlassen wird, weil Schleifenkopf, solange nicht mit ";" abgeschlossen, und Schleifenkörper ja quasi eine Einheit bilden.

    // eine "Einheit"
    while(/* ... */) 
    {
     \\ ... 
    }
    
    // keine "Einheit"
    while (/* ... */) ;
    
    {
     \\ ...
    }
    

    MfG
    WilMen


Anmelden zum Antworten