<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Variable_%28Programmierung%29</id>
	<title>Variable (Programmierung) - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Variable_%28Programmierung%29"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Variable_(Programmierung)&amp;action=history"/>
	<updated>2026-05-24T11:57:40Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Variable_(Programmierung)&amp;diff=297625&amp;oldid=prev</id>
		<title>imported&gt;SchlurcherBot: Bot: http → https</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Variable_(Programmierung)&amp;diff=297625&amp;oldid=prev"/>
		<updated>2026-01-25T14:24:48Z</updated>

		<summary type="html">&lt;p&gt;Bot: http → https&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;In der [[Programmierung]] ist eine &amp;#039;&amp;#039;&amp;#039;Variable&amp;#039;&amp;#039;&amp;#039; ein abstrakter Behälter für einen Wert, der bei der Ausführung eines [[Computerprogramm]]s auftritt. Im Normalfall wird eine Variable im [[Quelltext]] durch einen Namen bezeichnet und hat eine [[Speicheradresse|Adresse]] im Speicher des Computers.&lt;br /&gt;
&lt;br /&gt;
Der durch eine Variable repräsentierte Wert und gegebenenfalls auch die Größe kann&amp;amp;nbsp;– im Unterschied zu einer [[Konstante (Programmierung)|Konstante]]&amp;amp;nbsp;– zur [[Laufzeit (Informatik)|Laufzeit]] des Rechenprozesses verändert werden.&lt;br /&gt;
&lt;br /&gt;
== Arten von Variablen ==&lt;br /&gt;
Grundsätzlich unterscheidet man zwischen &amp;#039;&amp;#039;Wertevariablen&amp;#039;&amp;#039; und &amp;#039;&amp;#039;referenziellen Variablen&amp;#039;&amp;#039;. In einer Wertevariablen wird ein Wert direkt abgelegt, während eine referenzielle Variable als Wert die [[Speicheradresse]] des eigentlichen Wertes, einer [[Funktion (Programmierung)|Funktion]] oder eines [[Objekt (Programmierung)|Objektes]] enthält. Deshalb werden referenzielle Variablen auch als [[Zeiger (Informatik)|Zeiger]] bezeichnet.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiele in der [[Programmiersprache]] [[C-Sharp|C#]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
const int i = 3;         // Konstante; keine Variable&lt;br /&gt;
int j = 3;               // Wertevariable&lt;br /&gt;
object k = (object)3;    // referenzielle Variable auf einen Wert&lt;br /&gt;
object o = new object(); // referenzielle Variable auf ein Objekt&lt;br /&gt;
object n = null;         // referenzielle Variable auf das null-Objekt (Zeiger auf Speicheradresse 0)&lt;br /&gt;
Func&amp;lt;int&amp;gt; f = () =&amp;gt; 3;   // referenzielle Variable auf eine Funktion&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Verwendung von Variablen ==&lt;br /&gt;
Es lassen sich verschiedene Arten der Verwendung von Variablen unterscheiden:&lt;br /&gt;
* &amp;#039;&amp;#039;Eingabevariablen&amp;#039;&amp;#039; erhalten Werte, die von außen ins [[Computerprogramm|Programm]], die [[Funktion (Programmierung)|Funktion]] oder [[Methode (Programmierung)|Methode]] eingegeben werden (siehe [[Parameter (Informatik)|Parameter]]).&lt;br /&gt;
* &amp;#039;&amp;#039;Ausgabevariablen&amp;#039;&amp;#039; enthalten später die Resultate der Rechnung.&lt;br /&gt;
* &amp;#039;&amp;#039;Referenzvariablen&amp;#039;&amp;#039; ([[Zeiger (Informatik)|Zeiger]]) dienen sowohl als Eingangs- als auch Ausgangsvariable. Der Wert kann während der Rechnung verändert werden.&lt;br /&gt;
* &amp;#039;&amp;#039;Hilfsvariablen&amp;#039;&amp;#039; nehmen Werte auf, die im Verlauf der Rechnung benötigt werden.&lt;br /&gt;
* &amp;#039;&amp;#039;[[Umgebungsvariable]]n&amp;#039;&amp;#039; repräsentieren die äußeren Randbedingungen eines Programms.&lt;br /&gt;
* &amp;#039;&amp;#039;[[Metasyntaktische Variable]]n&amp;#039;&amp;#039; dienen zur bloßen Benennung von Entitäten oder Teilabschnitten des [[Programmcode]]s.&lt;br /&gt;
* &amp;#039;&amp;#039;Laufzeitvariablen&amp;#039;&amp;#039;&amp;lt;ref&amp;gt;[https://www.c-plusplus.net/forum/topic/217676/laufzeitvariable Festlegen und Löschen von Laufzeitvariablen] – ein Beitrag im &amp;#039;&amp;#039;C++-Community-Forum&amp;#039;&amp;#039; (die betreffende Seite wurde zuletzt geändert am 10. Juli 2008&amp;lt;!-- siehe auch ebenda, im auch sogenannten Quelltext mit: ‚lastposttimeISO‘ und ‚2008-07-10T14:54:25.000Z‘ --&amp;gt;); mit einem [[Zitat]] vom &amp;#039;&amp;#039;[[Visual Studio]] Analyzer&amp;#039;&amp;#039;, wo es heißt: {{&amp;quot;|Laufzeitvariablen sind Name/Wert-Paare, die von Ereignisabonnenten festgelegt und von Ereignisquellen gelesen werden.&lt;br /&gt;
Das Verwenden von Laufzeitvariablen hilft beim Sammeln genauer Einzelheiten über bestimmte Ereignisse.}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sichtweisen von Variablen ==&lt;br /&gt;
Das Konzept der Variablen wird von [[Programmiersprache]]n unterschiedlich interpretiert:&lt;br /&gt;
* in einer rein [[Funktionale Programmierung|funktionalen Programmiersprache]] sind Variablen einfach nur [[Bezeichner]], das heißt, sie werden wie im [[Lambda-Kalkül]] nur dazu verwendet, die Eingabeparameter für eine [[Funktion (Programmierung)|Funktion]] zu bezeichnen. Während der Berechnung eines Funktionswerts ändert sich der Wert der Variablen deshalb nicht. Ein [[Ausdruck (Programmierung)|Ausdruck]] mit Variablen hat stets den gleichen Wert, unabhängig davon, an welcher Stelle im [[Computerprogramm|Programm]] er auftritt. Diese Eigenschaft ist unter dem Begriff [[referentielle Transparenz]] bekannt.&lt;br /&gt;
* in einer [[Imperative Programmierung|imperativen Programmiersprache]] kann sich dagegen der Wert einer Variablen während des [[Programmablauf]]s ändern. Der gleiche Ausdruck mit Variablen kann deshalb an verschiedenen Stellen des Programms oder zu verschiedenen Zeiten in der Programmausführung ganz unterschiedliche Werte haben.&lt;br /&gt;
Dementsprechend definieren verschiedene Programmiersprachen den Begriff der Variablen ganz unterschiedlich. Im Fall von [[Java (Programmiersprache)|Java]] heißt es:&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=Eine Variable ist ein Speicherplatz.&lt;br /&gt;
 |ref=&amp;lt;ref&amp;gt;Tim Lindholm, Frank Yellin: &amp;#039;&amp;#039;The Java Virtual Machine Specification&amp;#039;&amp;#039;. Addison-Wesley, 1996: “A variable is a storage location.”&amp;lt;/ref&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
In der Sprachdefinition von [[Scheme]] heißt es dagegen&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=Scheme erlaubt es, dass Bezeichner für Speicherplätze stehen, die Werte enthalten.&amp;lt;br /&amp;gt;&lt;br /&gt;
 Solche Bezeichner heißen Variablen.&lt;br /&gt;
 |ref=&amp;lt;ref&amp;gt;Michael Sperber, William Clinger, R. K. Dybvig, Matthew Flatt, Anton van Straaten: &amp;#039;&amp;#039;Report on the Algorithmic Language Scheme.&amp;#039;&amp;#039; Revised (5.97): “Scheme allows identifiers to stand for locations containing values. These identifiers are called variables.”&amp;lt;/ref&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
Allgemein müssen für eine Variable in einer [[Imperative Programmiersprache|imperativen Programmiersprache]] vier Aspekte unterschieden werden:&lt;br /&gt;
* der Speicherplatz selbst als Behältnis für Daten,&lt;br /&gt;
* die in dem Speicherplatz abgelegten Daten,&lt;br /&gt;
* die [[Speicheradresse|Adresse]] des Speicherplatzes und&lt;br /&gt;
* der Bezeichner, unter dem der Speicherplatz angesprochen werden kann.&lt;br /&gt;
Kompliziert wird die Situation außerdem dadurch, dass unter einem bestimmten Bezeichner an verschiedenen Stellen des Programms oder zu verschiedenen Zeiten in der Programmausführung unterschiedliche Speicherplätze angesprochen sein können und dass es auch anonyme, also namenlose Variablen gibt.&lt;br /&gt;
&lt;br /&gt;
=== L-Wert und R-Wert von Variablen ===&lt;br /&gt;
Typisch für [[imperative Programmiersprache]]n ist, dass ein [[Bezeichner]] auf der linken Seite einer [[Wertzuweisung]] eine andere Bedeutung („L-Wert“) hat als auf ihrer rechten Seite („R-Wert“). Die Anweisung&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
x := x + 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
bedeutet: „Nimm den &amp;#039;&amp;#039;Wert&amp;#039;&amp;#039; der Variablen mit dem Namen &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;, erhöhe ihn um eins und speichere dies an die &amp;#039;&amp;#039;Adresse&amp;#039;&amp;#039; von &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;.“ Der L-Wert einer Variablen ist also ihre Adresse, der R-Wert ihr Inhalt.&lt;br /&gt;
&lt;br /&gt;
=== Variablen als Parameter von Funktionen ===&lt;br /&gt;
Auch die [[Parameter (Informatik)|Parameter]] einer [[Funktion (Programmierung)|Funktion]] werden in deren [[Deklaration (Programmierung)|Deklaration]] durch Variablen repräsentiert, die dann &amp;#039;&amp;#039;formale Parameter&amp;#039;&amp;#039; heißen. Beim Aufruf der Funktion werden den formalen Parametern dann [[Ausdruck (Programmierung)|Ausdrücke]] als &amp;#039;&amp;#039;tatsächlicher Parameter&amp;#039;&amp;#039; zugeordnet. Für die Übergabe der tatsächlichen Parameter an die Funktion gibt es unterschiedliche Mechanismen. Verbreitet sind die [[Wertparameter|Übergabe durch Wert]] und die [[Referenzparameter|Übergabe durch Referenz]].&lt;br /&gt;
&lt;br /&gt;
== Typen von Variablen ==&lt;br /&gt;
Mit jeder Variablen in einem [[Computerprogramm|Programm]] ist notwendigerweise ein bestimmter [[Datentyp]] (kurz: &amp;#039;&amp;#039;Typ&amp;#039;&amp;#039;) verbunden. Dies ist schon allein deshalb notwendig, weil nur der Datentyp festlegt, welche [[Operation (Informatik)|Operationen]] auf und mit der Variablen sinnvoll und zulässig sind. Der Datentyp einer Variablen kann auch die Speichergröße der Variablen festlegen. In der Regel hat der [[Programmierer]] die Möglichkeit, in einer [[Deklaration (Programmierung)|Deklaration]] diesen Typ festzulegen. In vielen [[Programmiersprache]]n ist eine solche explizite Deklaration sogar verpflichtend. Andere Programmiersprachen bieten &amp;#039;&amp;#039;implizite Deklarationen&amp;#039;&amp;#039;, die dann verwendet werden, wenn keine expliziten Deklarationen vorhanden sind. So kannte [[Fortran]] die Konvention, dass Variablen, deren Namen mit Buchstaben zwischen &amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; beginnen, vom Typ &amp;lt;code&amp;gt;INTEGER&amp;lt;/code&amp;gt; sind und alle anderen vom Typ &amp;lt;code&amp;gt;REAL&amp;lt;/code&amp;gt;, sofern nichts anderes festgelegt wird. Andere Programmiersprachen kennen sogenannte &amp;#039;&amp;#039;latente&amp;#039;&amp;#039; Typen. Hier sind Deklarationen nicht nötig, sondern die Maschine erkennt den Typ einer Variablen bei ihrer ersten Verwendung an ihrem Inhalt und führt diesen Typ dann stillschweigend weiter mit. In manchen Programmiersprachen kann der nicht explizit angegebene Typ einer Variablen unter gewissen Voraussetzungen auch vom [[Compiler]] mittels [[Typinferenz]] anhand anderer Typen, mit denen die Variable in einem Zusammenhang steht, erschlossen werden.&lt;br /&gt;
&lt;br /&gt;
In [[Dynamische Typisierung|dynamisch typisierten Programmiersprachen]] kann sich der Typ einer Variablen erst zur [[Laufzeit (Informatik)|Laufzeit]] eines Programmes ergeben und auch während der Programmausführung ändern. Folgendes Beispiel in [[JavaScript]] illustriert dies:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function show(value) {&lt;br /&gt;
    if (typeof value === &amp;#039;number&amp;#039;)&lt;br /&gt;
        value += &amp;quot; ist eine Zahl&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    console.log(value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
show(&amp;#039;Hallo Welt!&amp;#039;);&lt;br /&gt;
show(42);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Anker|Lokale Variable}} Variablen in einer Blockstruktur ==&lt;br /&gt;
Ein wichtiges Konzept von [[Programmiersprache]]n ist das [[Unterprogramm]], ob es nun [[Prozedur (Programmierung)|Prozedur]], [[Funktion (Programmierung)|Funktion]], [[Objektorientierte Programmierung#Methoden|Methode]] oder noch anders heißt. Die allgemeinste Form dieses Konzepts ist der in der Programmiersprache [[Algol 60]] erstmals eingeführte &amp;#039;&amp;#039;Block&amp;#039;&amp;#039;. Praktisch alle Programmiersprachen, die dieses Konzept in irgendeiner Form anbieten, erlauben es, dass Blöcke ihre eigenen Variablen besitzen, die sich von den Variablen anderer Blöcke eindeutig unterscheiden lassen. Solch eine Variable heißt &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;lokale&amp;#039;&amp;#039; Variable&amp;#039;&amp;#039;&amp;#039;. Eine Variable, die im ganzen [[Computerprogramm|Programm]] für alle Blöcke zur Verfügung steht, heißt &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;globale&amp;#039;&amp;#039; Variable&amp;#039;&amp;#039;&amp;#039;. Die Programmiersprache [[PHP]] kennt sogar den Begriff der &amp;#039;&amp;#039;superglobalen&amp;#039;&amp;#039; Variablen, die für alle Programme verfügbar ist, die zur selben Zeit von einem PHP-[[Interpreter]] bearbeitet werden.&lt;br /&gt;
&lt;br /&gt;
Globale Variablen sind scheinbar bequem, weil sie im ganzen Programm [[Sichtbarkeit (Programmierung)|sichtbar]] sind. Es ist nicht notwendig, sie beim Aufruf einer Funktion als [[Parameter (Informatik)|Parameter]] zu übergeben. Sie werden aber auch leicht zur Fehlerquelle, wenn man zum Beispiel eine globale Variable versehentlich oder sogar bewusst für verschiedene Zwecke benutzt.&lt;br /&gt;
&lt;br /&gt;
Auch kann es passieren, dass man eine lokale Variable mit dem Namen der globalen Variablen verwendet, von dem man annimmt, dass er im Programm bisher noch nicht benutzt wurde. Wenn es diesen Namen aber schon als Variable mit passendem [[Datentyp|Typ]] gibt, sofern dieser überhaupt vom [[Compiler]] oder vom [[Laufzeitsystem]] geprüft wird, dann wird deren Wert unkontrolliert überschrieben und umgekehrt. Ein schwer zu findender Fehler ist oft die Folge.&lt;br /&gt;
&lt;br /&gt;
Erfahrene [[Softwareentwickler|Entwickler]] verwenden globale Variablen nur auf [[Modul (Software)|modularer]] Ebene und nur dann, wenn es sich nicht vermeiden lässt.&lt;br /&gt;
&lt;br /&gt;
=== Sichtbarkeitsbereich von Variablen (Scope) ===&lt;br /&gt;
Unter dem [[Sichtbarkeit (Programmierung)|Sichtbarkeitsbereich]] (englisch &amp;#039;&amp;#039;scope&amp;#039;&amp;#039;) einer Variablen versteht man den Programmabschnitt, in dem die Variable nutzbar und sichtbar ist. Da eine lokale Variable in den meisten [[Programmiersprache]]n den gleichen Namen tragen darf wie eine globale Variable, sind Sichtbarkeitsbereiche nicht notwendig zusammenhängend: Durch die [[Deklaration (Programmierung)|Deklaration]] einer lokalen Variable wird die gleichnamige globale Variable für einen bestimmten Block „verdeckt“, das heißt, sie ist in diesem Block nicht sichtbar.&lt;br /&gt;
&lt;br /&gt;
Die &amp;#039;&amp;#039;Sichtbarkeitsregeln&amp;#039;&amp;#039; können auf zwei unterschiedliche sich gegenseitig ausschließende Arten festgelegt werden. Dabei ist das Konzept der &amp;#039;&amp;#039;Bindung&amp;#039;&amp;#039; wichtig. Bindung bedeutet hier die Zuordnung eines bestimmten Namens zu der damit verbundenen Variablen.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;lexikalisch&amp;#039;&amp;#039; (oder &amp;#039;&amp;#039;statisch&amp;#039;&amp;#039;), das heißt, der umgebende [[Quelltext]] bestimmt die Bindung&lt;br /&gt;
* &amp;#039;&amp;#039;dynamisch&amp;#039;&amp;#039;, das heißt, die Ausführungsschicht zur [[Laufzeit (Informatik)|Laufzeit]] des Programms bestimmt die Bindung.&lt;br /&gt;
&lt;br /&gt;
Im Fall einer lexikalischen Bindung sind die Bindungen für einen ganzen Block immer die gleichen, weil sie allein durch die [[Blockstruktur]] vorgegeben sind. Man kann daher allein durch Analyse des Quelltextes einer [[Funktion (Programmierung)|Funktion]] verstehen, wie sich die Funktion verhält. Dieses Konzept unterstützt daher [[modulare Programmierung]].&lt;br /&gt;
&lt;br /&gt;
Bei dynamischen Bindungsregeln können zur Laufzeit immer neue Bindungen eingeführt werden. Diese gelten dann so lange, bis sie explizit aufgehoben werden oder durch eine neue [[dynamische Bindung]] verdeckt werden. Man kann daher durch Analyse des Programmtextes einer Funktion nicht notwendigerweise verstehen, wie sich diese verhält. Selbst die Analyse des gesamten Programmtextes eines Programms hilft nicht. Es lässt sich statisch nicht verstehen, wie sich die Funktion verhält. Ihr Verhalten hängt von den jeweiligen (direkt und indirekt) aufrufenden Funktionen ab. Dies widerspricht dem Konzept des modularen Programmierens.&lt;br /&gt;
&lt;br /&gt;
Die meisten modernen Programmiersprachen unterstützen nur lexikalische Bindung, zum Beispiel [[C++]], [[C (Programmiersprache)|C]], [[ML (Programmiersprache)|ML]], [[Haskell (Programmiersprache)|Haskell]], [[Python (Programmiersprache)|Python]], [[Pascal (Programmiersprache)|Pascal]]. Einige wenige unterstützen nur dynamische Bindung, zum Beispiel [[Emacs Lisp]], [[Logo (Programmiersprache)|Logo]], und einige, zum Beispiel [[Perl (Programmiersprache)|Perl]] und [[Common Lisp]], erlauben dem [[Programmierer]], für jede lokale Variable festzulegen, ob sie nach lexikalischen (statischen) oder dynamischen Regeln gebunden sein soll.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Range of Variables.png|Verschiedene Gültigkeitsbereiche von Variablen]]&lt;br /&gt;
&lt;br /&gt;
===={{Anker|Gültigkeitsbereich}} Beispiel lexikalisch im Gegensatz zu dynamisch ====&lt;br /&gt;
[[C++]] und [[C (Programmiersprache)|C]] verwenden lexikalische (statische) &amp;#039;&amp;#039;&amp;#039;Gültigkeitsbereiche&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int x = 0;&lt;br /&gt;
int f() { return x; }&lt;br /&gt;
int g() { int x = 1; return f(); } /* g() =&amp;gt; 0 */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im obigen Programmfragment ergibt &amp;lt;code&amp;gt;g()&amp;lt;/code&amp;gt; immer 0 (den Wert der globalen Variablen &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;, nicht den Wert der lokalen Variablen &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;g()&amp;lt;/code&amp;gt;). Dies ist so, weil in &amp;lt;code&amp;gt;f()&amp;lt;/code&amp;gt; immer nur das globale &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; sichtbar ist.&lt;br /&gt;
&lt;br /&gt;
In [[Perl (Programmiersprache)|Perl]] können lokale Variablen lexikalisch (statisch) mit dem Schlüsselwort &amp;lt;code&amp;gt;my&amp;lt;/code&amp;gt; oder dynamisch mit dem irreführenden [[Schlüsselwort (Programmierung)|Schlüsselwort]] &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; deklariert werden.&amp;lt;ref&amp;gt;[https://www.perl.com/doc/FAQs/FAQ/oldfaq-html/Q4.3.html &amp;#039;&amp;#039;What’s the difference between dynamic and static (lexical) scoping?&amp;#039;&amp;#039;] Perl FAQ 4.3&amp;lt;/ref&amp;gt; Das folgende Beispiel entspricht dem obigen in C:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$x = 0;&lt;br /&gt;
sub f { return $x; }&lt;br /&gt;
sub g { my $x = 1; return f(); }&lt;br /&gt;
print g().&amp;quot;\n&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieses Beispiel benutzt &amp;lt;code&amp;gt;my&amp;lt;/code&amp;gt;, um &amp;lt;code&amp;gt;$x&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;g()&amp;lt;/code&amp;gt; einen lexikalischen (statischen) [[Sichtbarkeit (Programmierung)|Sichtbarkeitsbereich]] zu geben. Daher wird &amp;lt;code&amp;gt;g()&amp;lt;/code&amp;gt; immer 0 ergeben. &amp;lt;code&amp;gt;f()&amp;lt;/code&amp;gt; kann &amp;lt;code&amp;gt;g()&amp;lt;/code&amp;gt;’s &amp;lt;code&amp;gt;$x&amp;lt;/code&amp;gt; nicht sehen, obwohl dies zum Zeitpunkt, zu dem &amp;lt;code&amp;gt;f()&amp;lt;/code&amp;gt; aufgerufen wird, noch existiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$x = 0;&lt;br /&gt;
sub f { return $x; }&lt;br /&gt;
sub g { local $x = 1; return f(); }&lt;br /&gt;
print g().&amp;quot;\n&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieses Beispiel benutzt &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt;, um &amp;lt;code&amp;gt;$x&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;g()&amp;lt;/code&amp;gt; einen dynamischen Sichtbarkeitsbereich zu geben.  Somit kann &amp;lt;code&amp;gt;f()&amp;lt;/code&amp;gt; den lokal, in &amp;lt;code&amp;gt;g()&amp;lt;/code&amp;gt;, geltenden Wert von &amp;lt;code&amp;gt;$x&amp;lt;/code&amp;gt; verwenden und &amp;lt;code&amp;gt;g()&amp;lt;/code&amp;gt; liefert den Wert 1.&lt;br /&gt;
&lt;br /&gt;
In der Praxis sollte man in der Regel für Variablen in Perl &amp;quot;&amp;lt;code&amp;gt;my&amp;lt;/code&amp;gt;&amp;quot; verwenden.&lt;br /&gt;
&lt;br /&gt;
==={{Anker|Automatische Variable}} Lebensdauer von Variablen ===&lt;br /&gt;
Unter der Lebensdauer einer Variablen versteht man den Zeitraum, in dem die Variable [[Speicherplatz]] reserviert hat. Wird der Speicherplatz für andere Zwecke wieder freigegeben, so „stirbt“ die Variable und ist nicht mehr nutzbar. Lokale Variablen werden bei jedem Aufruf der [[Funktion (Programmierung)|Funktion]] erstellt. In der Regel wird der Speicherplatz beim Verlassen der Funktion wieder freigegeben. [[Sichtbarkeit (Programmierung)|Sichtbarkeitsbereich]] und Lebensdauer von Variablen sind in klassischen blockstrukturierten [[Programmiersprache]]n so aufeinander abgestimmt, dass Speicherplatz für eine Variable nur so lange zugeordnet sein muss, wie Code aus dem Sichtbarkeitsbereich ausgeführt wird. Als Konsequenz davon lässt sich eine besonders einfache Art der Speicherverwaltung verwenden: Lokale Variablen werden automatisch zur [[Laufzeit (Informatik)|Laufzeit]] auf einem [[Stapelspeicher]] angelegt, sobald ein Block betreten wird. Bisweilen werden diese Variablen daher &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;automatische Variablen&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; genannt. Technisch gesprochen wird ein &amp;#039;&amp;#039;Aktivierungsblock&amp;#039;&amp;#039; auf einem &amp;#039;&amp;#039;Laufzeitstapel&amp;#039;&amp;#039; angelegt, der beim Verlassen des Blocks wieder entfernt wird.&lt;br /&gt;
&lt;br /&gt;
In manchen Programmiersprachen, zum Beispiel [[C (Programmiersprache)|C]], gibt es einen Zusatz &amp;lt;code&amp;gt;static&amp;lt;/code&amp;gt; bei der [[Deklaration (Programmierung)|Deklaration]], der nur die Sichtbarkeit einer Variablen auf den [[Namensraum]] der Funktion einschränkt, nicht aber ihre Lebensdauer. Die Sichtbarkeit einer solchen Variablen verhält sich also wie die einer lokalen Variablen, die Lebensdauer dagegen wie die einer globalen, das heißt, beim Eintritt in die sie umschließende Funktion hat sie exakt den gleichen Wert wie am Ende des letzten Aufrufs der Funktion. Auf der Implementierungsseite sind dafür keine besonderen Vorrichtungen notwendig: Die Variable wird einfach im Aktivierungsblock des Hauptprogramms angelegt.&lt;br /&gt;
&lt;br /&gt;
=== Speicherzuweisung ===&lt;br /&gt;
Die Besonderheiten der Variablenzuweisung und die Darstellung ihrer Werte variieren stark, sowohl zwischen [[Programmiersprache]]n als auch zwischen [[Implementierung]]en einer bestimmten Sprache. Viele Sprachimplementierungen weisen Platz für lokale Variablen zu, deren Umfang für einen einzelnen Funktionsaufruf auf dem [[Aufrufstapel]] gilt und deren Speicher bei der Rückkehr der Funktion automatisch zurückgefordert wird. Im Allgemeinen wird bei der Namensbindung der Name einer Variablen an die Adresse eines bestimmten Blocks im Speicher gebunden, und [[Operation (Informatik)|Operationen]] an der Variablen manipulieren diesen Block. Das Referenzieren ist häufiger bei Variablen, deren Werte beim [[Kompilieren]] des Codes große oder unbekannte Größen haben. Solche Referenzvariablen ([[Zeiger (Informatik)|Zeiger]]) verweisen auf die Position des Werts, anstatt den Wert selbst zu speichern, der aus einem Speicherbereich zugewiesen wird, der als [[Heap (Datenstruktur)|Heap]] bezeichnet wird.&lt;br /&gt;
&lt;br /&gt;
Gebundene Variablen haben Werte. Ein Wert ist jedoch eine Abstraktion. In der Implementierung wird ein Wert durch ein Datenobjekt dargestellt, das irgendwo gespeichert ist. Das [[Computerprogramm|Programm]] oder die [[Laufzeitumgebung]] muss Speicher für jedes Datenobjekt reservieren und, da der Speicher endlich ist, sicherstellen, dass dieser Speicher zur Wiederverwendung bereitgestellt wird, wenn das [[Objekt (Programmierung)|Objekt]] nicht mehr zur Darstellung des Werts einer Variablen benötigt wird.&lt;br /&gt;
&lt;br /&gt;
Vom Heap zugewiesene Objekte müssen zurückgefordert werden, insbesondere wenn die Objekte nicht mehr benötigt werden. In einer Programmiersprache mit [[Garbage Collection|Garbage Collector]], zum Beispiel [[C-Sharp|C#]], [[Java (Programmiersprache)|Java]] oder [[Python (Programmiersprache)|Python]], fordert die Laufzeitumgebung Objekte automatisch zurück, wenn vorhandene Variablen nicht mehr auf sie verweisen können. In Programmiersprachen ohne Garbage Collector, zum Beispiel [[C (Programmiersprache)|C]] oder [[C++]], muss das Programm und der [[Programmierer]] explizit Speicher zuweisen und ihn später freigeben, um seinen Speicher zurückzugewinnen. Andernfalls kommt es zu Speicherverlusten, bei denen der Heap während der Programmausführung aufgebraucht wird.&lt;br /&gt;
&lt;br /&gt;
Wenn sich eine Variable auf eine dynamisch erstellte [[Datenstruktur]] bezieht, kann auf einige ihrer Komponenten nur indirekt über die Variable zugegriffen werden. Unter solchen Umständen müssen Garbage Collectors einen Fall behandeln, in dem nur ein Teil des von der Variablen erreichbaren Speichers zurückgefordert werden muss.&lt;br /&gt;
&lt;br /&gt;
== Namenswahl ==&lt;br /&gt;
Die Wahl von Variablennamen bleibt meist dem [[Programmierer]] überlassen. Zur Vereinfachung der Nachvollziehbarkeit der [[Quelltext]]e empfiehlt es sich, möglichst &amp;#039;&amp;#039;selbsterklärende Variablennamen&amp;#039;&amp;#039; oder auch sogenannte &amp;#039;&amp;#039;[[Sprechender Name#Sprechende Namen in der Programmierung|sprechende Variablennamen]]&amp;#039;&amp;#039; zu verwenden, selbst wenn dies zu recht langen [[Bezeichner]]n führt.&amp;lt;ref&amp;gt;{{Literatur |Autor=N. Gorla, A. C. Benander, B. A. Benander |Hrsg=IEEE |Titel=Debugging Effort Estimation Using Software Metrics |Sammelwerk=IEEE Transactions on Software Engineering |Band=16 |Nummer=2 |Datum=1990-02 |Seiten=223–231 |Sprache=en |DOI=10.1109/32.44385}}&amp;lt;/ref&amp;gt; [[Namenskonvention (Datenverarbeitung)|Namenskonventionen]] für Variablen verbessern die Lesbarkeit und [[Programmierung#Wartbarkeit|Wartbarkeit]] der Quelltexte. Moderne [[Editor (Software)|Editoren]] haben Vorrichtungen, um den Schreibaufwand auch bei langen Variablennamen zu reduzieren. Nach der [[Compiler|Kompilierung]] ist der [[Maschinensprache|Programmcode]] weitgehend oder sogar vollständig unabhängig von den verwendeten Variablennamen.&lt;br /&gt;
&lt;br /&gt;
== Initialisierung ==&lt;br /&gt;
Variablen sollten vor ihrer Benutzung initialisiert werden, das heißt, einen definierten Wert zugewiesen bekommen. Dies kann durch die Vergabe von Standardwerten durch das [[Laufzeitsystem]] der verwendeten [[Programmiersprache]] geschehen oder durch explizite Zuweisung eines Wertes an die Variable.&lt;br /&gt;
&lt;br /&gt;
Bei Programmiersprachen, die nicht automatisch alle verwendeten Variablen initialisieren, sind uninitialisierte Variablen eine Quelle für schwer zu findende Fehler: Da die Variable ohne Initialisierung einen zufälligen Wert enthält, wird auch das Verhalten des [[Computerprogramm|Programms]] unvorhersagbar, so dass es manchmal falsche Ergebnisse liefert oder gar abstürzt. Enthält der für die Variable reservierte Speicherbereich einen scheinbar erwarteten Inhalt aus einem vorhergehenden Programmdurchlauf, so spricht man auch von einer &amp;#039;&amp;#039;&amp;#039;Speicherinterferenz&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Attribut (Programmierung)]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
{{Wiktionary|Variable}}&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Programmiersprachelement]]&lt;/div&gt;</summary>
		<author><name>imported&gt;SchlurcherBot</name></author>
	</entry>
</feed>