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
agepopt 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
-
@WilMen,
Laut Standard sieht der Scope der while Schleife so aus:
"6.5.1 The while statement" Abschnitt 2label: { // Start of while scope /* was auch immer im Kopf steht */ if(/* Resultat im Kopf */) { // Inhalt der While-Schleife. goto label; } } // End of while scopeDu 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