Variablen in Umgebungen
-
Hallo,
mir ging die Tage wieder eine Frage durch den Kopf im Zusammenhang mit Umgebungen. Wenn ich das richtig verstehe, dann ist alleine die Verwendung von { } eine kleine Umgebung in dem Sinne, dass eine darin deklarierte Variable beim Erreichen von } ihre Gültigkeit verliert.
Eine vielleicht seltsam anmutende Frage, aber wie betritt denn eine Variable eine Umgebung? Im Zusammenhang z.B. mit Funktionen ist immer die Frage, ob eine Variable als Referenz übergeben wird oder nicht. D.h. überleben Änderungen an einer übergebenen Variablen den Gültigkeitsbereich oder nicht.
Umgekehrt ist z.B. eine
forSchleife ziemlich unproblematisch, da werden alle Änderungen einfach übernommen.Jetzt kann man natürlich sagen, dass dass eine eben eine Funktion ist und das andere halt eine Schleife - aber irgendwie sind doch beides Umgebungen, angedeutet durch die geschweiften Klammern. Also wird eine Variable übergeben sobald C++ auf geschweifte Klammern trifft?
Und im Falle von
for, while, ifo.ä. immer als Referenz?Gruß,
-- Klaus.
-
Also wird eine Variable übergeben sobald C++ auf geschweifte Klammern trifft?
Nein.
Und im Falle von for, while, if o.ä. immer als Referenz?
Unsinn.
Eine vielleicht seltsam anmutende Frage, aber wie betritt denn eine Variable eine Umgebung?
Ich glaube du meinst ihre Definition.
-
Klaus82 schrieb:
wie betritt denn eine Variable eine Umgebung?
Hä?
Klaus82 schrieb:
Im Zusammenhang z.B. mit Funktionen ist immer die Frage, ob eine Variable als Referenz übergeben wird oder nicht. D.h. überleben Änderungen an einer übergebenen Variablen den Gültigkeitsbereich oder nicht.
Dein letzter Satz hier lässt mich glauben, dass du Referenzen nicht ganz verstanden hast. Es ist zumindest eine komische Formulierung.
Klaus82 schrieb:
Umgekehrt ist z.B. eine
forSchleife ziemlich unproblematisch, da werden alle Änderungen einfach übernommen.Was für Änderungen? Wieso redest Du immer von Änderungen, die ggf übernommen werden? Das klingt so, als seien Referenzen doch nur Kopien, wobei ggf geänderte Werte später zurückkopiert werden. So funktioniert das aber nicht.
Klaus82 schrieb:
Jetzt kann man natürlich sagen, dass dass eine eben eine Funktion ist und das andere halt eine Schleife - aber irgendwie sind doch beides Umgebungen, angedeutet durch die geschweiften Klammern. Also wird eine Variable übergeben sobald C++ auf geschweifte Klammern trifft?
Du siehst da irgendwo Inkonsistenzen, wo keine sind. Wahrscheinlich weil Du da ordentlich etwas missverstanden hast. Ob Du eine Funktion aufrufst oder nicht, macht da überhaupt keinen Unterschied. Schau mal:
void dings(int wert, int& ref) { wert += 1; ref += 1; } int main() { int x = 23; int y = 42; dings(x,y); cout << x << ' ' << y << endl; }ist praktisch das Gleiche wie
int main() { int x = 23; int y = 42; { int wert = x; int& ref = y; wert += 1; ref += 1; } cout << x << ' ' << y << endl; }wertundxsind zwei Variablen, die sich auf ihren eigenen Speicher beziehen. Die Adressen vonxundwertsind also verschieden.wertspeichert eine Kopie dessen, was inxdrin steht, weil die Variable so initialisiert wurde. Danach veränderst du die Speicherstelle(n), auf die sichwertbezieht. Da aberxundwertsich nicht überlappen, veränderst Duxdamit nicht.refist dagegen eine Referenz. Eine Referenz ist wie ein neuer Name für dasselbe Objekt, mit dem du die Referenz initialisiert hast. Deswegen verändertref += 1denselben Speicher, den du auch über den Namenyerreichst. Du hast damit also zwei Namen für denselben Speicherbereich.Die Ausgabe ist jeweils
23 43
-
int i; i = 0;ist identisch zu
int i; { i = 0; }ist identisch zu
int i; {{{ i = 0; }}}Es gibt da kein "Betreten" in dem Sinne, stell es dir lieber vor als wären umgebende Gültigkeitsbereiche automatisch im eingebetteten Gültigkeitsbereich drin, ohne Referenzen oder sonstigem Code.