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 for Schleife 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, if o.ä. immer als Referenz?

    Gruß,
    -- Klaus.


  • Mod

    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 for Schleife 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;
    }
    

    wert und x sind zwei Variablen, die sich auf ihren eigenen Speicher beziehen. Die Adressen von x und wert sind also verschieden. wert speichert eine Kopie dessen, was in x drin steht, weil die Variable so initialisiert wurde. Danach veränderst du die Speicherstelle(n), auf die sich wert bezieht. Da aber x und wert sich nicht überlappen, veränderst Du x damit nicht.

    ref ist dagegen eine Referenz. Eine Referenz ist wie ein neuer Name für dasselbe Objekt, mit dem du die Referenz initialisiert hast. Deswegen verändert ref += 1 denselben Speicher, den du auch über den Namen y erreichst. 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.


Anmelden zum Antworten