Lokale Variable

Im Informatik, a lokale Variable ist ein Variable das ist gegeben lokal Umfang. Eine lokale variable Referenz in der Funktion oder Block in dem erklärt wird, dass es den gleichen variablen Namen im größeren Bereich überschreibt. Im Programmiersprachen Mit nur zwei Sichtbarkeitsebenen werden lokale Variablen im Gegensatz zu stehen globale Variablen. Andererseits viele Algol-Abgeleitete Sprachen ermöglichen eine beliebige Anzahl verschachtelter Sichtbarkeitsniveaus mit privaten Variablen, Funktionen, Konstanten und Typen, die in ihnen verborgen sind, entweder durch verschachtelte Blöcke oder durch verschachtelte Blöcke oder verschachtelte Funktionen. Lokale Variablen sind von grundlegender Bedeutung für Verfahrensprogrammierungund allgemeiner Modulare Programmierung: Variablen des lokalen Bereichs werden verwendet, um Probleme mit zu vermeiden Nebenwirkungen das kann mit auftreten globale Variablen.

Zielfernrohr

Lokale Variablen können eine lexikalische oder dynamische Dynamik haben UmfangObwohl lexikalische (statische) Scoping weitaus häufiger ist. Wenn ein lexikaler Scoping (oder lexikalischer Bereich; auch als statischer Scoping oder statischer Bereich bezeichnet wird), ist der Programmtext der Programmtext der Blockdefinition: Innerhalb des Textes dieses Blocks ist der variable Name existiert und ist der Programmtext der Blockdefinition. ist an den Wert der Variablen gebunden, aber außerhalb des Textes dieses Blocks existiert der variable Name nicht. Im Gegensatz dazu ist im dynamischen Scoping (oder dynamischen Bereich), wenn ein Variablenname ein bestimmter Block ist, sein Umfang dieser Block und alle Funktionen, die durch diesen Block transitiv aufgerufen werden (außer wenn sie erneut durch eine andere Deklaration überschrieben); Nach dem Ende des Blocks existiert der variable Name nicht. Einige Sprachen wie Perl und Common LispErmöglichen Sie dem Programmierer die Auswahl statischer oder dynamischer Scops, wenn Sie eine Variable definieren oder neu definieren. Beispiele für Sprachen, die dynamischen Scoping verwenden Logo, EMACS Lispund die Muschelsprachen verprügeln, Bindestrichund die Mirbs Korn Shell (Mksh) "lokaler" Erklärung. Die meisten anderen Sprachen bieten lexikalisch abgeschottete lokalen Variablen.

In den meisten Sprachen sind lokale Variablen Automatische Variablen auf dem aufbewahrt Rufen Sie Stack an direkt. Das bedeutet, dass wenn a rekursive Funktion Ruft sich selbst auf, lokale Variablen in jeder Instanz der Funktion werden unterschiedlich angegeben Adressen. Daher können Variablen dieses Umfangs ohne ein Risiko von deklariert, geschrieben und gelesen werden Nebenwirkungen zu Funktionen außerhalb des Blocks, in dem sie deklariert werden.

Programmiersprachen, die anwenden Rufen Sie nach Wert an Die Semantik liefert eine genannte Unterroutine mit einer eigenen lokalen Kopie der Argumente an ihn vorbeigegangen. In den meisten Sprachen werden diese lokalen Parameter genauso behandelt wie andere lokale Variablen innerhalb der Unterroutine. Im Gegensatz, Rufen Sie durch Referenz an und Rufen Sie mit dem Namen an Die Semantik ermöglicht es den Parametern, als Aliase der als Argumente übergebenen Werte zu wirken, sodass die Unterroutine Variablen außerhalb seines eigenen Umfangs ändern kann.

Statische lokale Variablen

Eine spezielle Art von lokaler Variable, genannt a statischer lokaler, ist in vielen Mainstream -Sprachen erhältlich (einschließlich C/C ++, Visual Basic, und Vb.net), der es ermöglicht, einen Wert von einem Ruf der Funktion zu einem anderen zu halten - er ist a Statische Variable mit lokalem Umfang. In diesem Fall haben rekursive Aufrufe der Funktion auch Zugriff auf die (Single, statisch zugewiesen) Variable. In allen oben genannten Sprachen werden statische Variablen als solches mit einem besonderen deklariert Speicherklasse Schlüsselwort (z. B.,, statisch).

Statische Einheimische in globalen Funktionen haben die gleiche Lebensdauer wie Statische globale Variablen, weil ihr Wert für die Lebensdauer des Programms in Erinnerung bleibt,[1] aber haben Funktionsumfang (nicht globaler Umfang), wie bei automatischen lokalen Variablen.

Dies unterscheidet sich von anderen Verwendungen der statisch Stichwort, was in verschiedenen Sprachen verschiedene Bedeutungen hat.

Lokale Variablen in Perl

Perl Unterstützt sowohl dynamische als auch lexikalisch gescopte lokale Variablen. Das Schlüsselwort lokal wird verwendet, um lokale dynamisch gescopte Variablen zu definieren, während mein wird für lokale lexikalisch gescopte Variablen verwendet. Da der dynamische Scoping heute weniger verbreitet ist, warnt die Perl -Dokumentation, dass "lokal Ist das nicht das, was die meisten Menschen als "lokal" betrachten.[2] Stattdessen die lokal Schlüsselwort gibt ein temporäres, dynamisch gescopet Wert für eine globale (Paket-) Variable, die bis zum Ende des umschließenden Blocks dauert. Die Variable ist jedoch für jede Funktion aus dem Block sichtbar.[3] Verwenden Sie die mein Operator stattdessen.[4]

Um zu verstehen, wie es funktioniert, betrachten Sie den folgenden Code:

$ a = 1; Sub f() {  lokal $ a;  $ a = 2;  g(); } Sub g() {  drucken "$ a \ n"; } g(); f(); g(); 

Dies wird ausgeben:

1 2 1 

Dies geschieht, da die globale Variable $ A an einen neuen geändert wird vorübergehend (lokal) Bedeutung im Inneren f(), aber der globale Wert wird wiederhergestellt, wenn der Umfang von f().

Verwendung mein in diesem Fall anstelle von lokal hätte 1 dreimal gedruckt, da in diesem Fall die $ a Variable wäre auf den statischen Umfang der Funktion beschränkt f() und nicht gesehen von g().
Randal L. Schwartz und Tom Phoenix argumentieren, dass der Bediener lokal hätte einen anderen Namen haben sollen wie sparen.[5]

Lokale Variablen in Ruby

Rubin Als Sprache wurde auch Perl inspiriert, aber in diesem Fall wurde die Notation vereinfacht: Ein globaler Variablenname muss ein $ -Schark vorangehen wie $ variable_name, während eine lokale Variable vor ihrem Namen einfach kein $ sign Variablennamen (Während in Perl haben alle Skalarwerte ein $ vor). Beachten Sie, dass Ruby nur eine integrierte Unterstützung für staatlich gescopte lokale Variablen wie Perls bietet mein, nicht dynamisch lokale Variablen wie Perls lokal. Es gibt mindestens eine Bibliothek für Ruby, die dynamisch gescopte Variablen liefert.[6]

Siehe auch

Verweise

  1. ^ "Strom C Standard" (PDF). (3,61 MB) (Ab 2009). Insbesondere siehe Abschnitt 6.2.4 „Speicherdauer von Objekten“, Seite 32.
  2. ^ perldoc.perl.org: lokal
  3. ^ perldoc.perl.org: perlsub: temporäre Werte über lokal()
  4. ^ perldoc.perl.org: Perlsub: Private Variablen über mein()
  5. ^ Randal L. Schwartz und Tom Phoenix (2001-07-01). Lernen Perl 3. Auflage.O'Reilly.Absatz 4.7. ISBN 0-596-00132-0.
  6. ^ Conrad Irwin."LSPACE: Dynamischer Umfang für Ruby".Dezember 2012http://cirw.in/blog/lspace Abgerufen 2013-10-16.