Einführung in Variablen im Rahmen der Lehre des Programmierens (Variable, Variablen, Variablendefinition, Zuweisung), Lektion
Stefan Ram 720415 = http://www.purl.org/stefan_ram/pub/programmieren_variable_de

Variablen

Objekte

Bei Programmieren werden oft Objekte verwendet.

Ein Objekt ist ein Speicher mit einem bestimmten Datentyp.

Ein Objekt kann man sich auch als einen Behälter für einen Wert vorstellen. Etwa so wie einen Plastikbecher für Lottokugeln, in dem immer genau eine bestimmte Kugel liegt.

Objekt als Behaelter fuer einen Wert
   .                       . 
| _____ Wert | Objekt 
| .-' '-. | 
| .' # ## '. | 
| / ## # # \ | 
| ; # # # ; | 
| | # # | | 
| ; # # ; | 
| \ # # / | 
' '. ### ######.' ' 
\ '-._____.-' / 
'-------------------'

Zu jedem Zeitpunkt ist dem Objekt als sein Wert (Zustand, Inhalt) ein bestimmter Wert des Datentyps zugeordnet. Zu einem anderen Zeitpunkt, kann es wieder einen anderer Wert des gleichen Datentyps sein.

Die Abhängigkeit von einem bestimmten Laufzeitpunkt ist in dem folgenden Diagramm durch den nachgestellten Text "(t)" gekennzeichnet.

Objekt [UML, modified static structure diagram]
                        .------------. 
1 | Typ | 
.----->| | 
| | | 
| '------------' 

.---------. | .------------. 
| Objekt |------' 1(t)| Wert(t) | 
| |------------>| | 
| |------. | | 
'---------' | '------------' 

| .-----------. 
| 1 | Eigen- | 
'----->| schaft- | 
| ten | 
'-----------'

Variablen

Wenn man einen Bezeichner als ein Objekt definiert, so spricht man von einer Variablen.

Eine Variable ist ein benanntes Objekt.

Eine Variable hat also einen Namen (Bezeichner) und ein Objekt. Daneben hat eine Variable manchmal noch spezielle Eigenschaften.

Wenn der Wert eines Objektes einer Zahlenvariablen beispielsweise der Wert "12" ist, dann müßte man etwas sagen wie „Der Wert des Objektes  der Variablen ist 12“, aber stattdessen sagt man dafür meisten etwas abkürzend „Der Wert der Variablen  ist 12“. Allerdings faßt man in vielen Programmiersprachen als Wert einer Variablen mal das Objekt und mal dessen Wert auf, je nachdem in welchem Zusammenhang die Variable verwendet wird.

Genauso wird auch statt „das Objekt mit dem Namen "x"“ oft einfach nur gesagt „das Objekt "x"“, wenn "x" der Namen einer Variablen mit diesem Objekt ist.

Variable [UML, static structure diagram]
.----------.              .---------.              .---------. 
| Variable | * 1 | Name | 1 | Typ | 
| |--------------| | .------| | 
| | | | | | | 
| | '---------' | '---------' 
| | .---------. | .---------. 
| | * 1 | Objekt |-------' 1(t)| Wert(t) | 
| |--------------| |--------------| | 
| | | |-------. | | 
| | '---------' | '---------' 
| | .---------. | .---------. 
| | * 1 | Eigen- | | 1 | Eigen- | 
| |--------------| schaf- | '------| schaf- | 
| | | ten | | ten | 
'----------' '---------' '---------'

Man kann sich eine Variable auch als ein Objekt vorstellen, auf das man ein Etikett mit einem Namen geklebt hat. Speicher eine bestimmte Variable die Zeile, in der etwas ausgegeben wird, so würde man dafür beispielsweise eine Variable mit dem Namen "Zeile" verwenden.

Variable als benannter Behaelter fuer einen Wert
   .                       . 
|-------. _____ Wert | Objekt 
| Zeile |' '-. | 
|-------'# ## '. | 
| / ## # # \ | 
| ; # # # ; | 
| | # # | | 
| ; # # ; | 
| \ # # / | 
' '. ### ######.' ' 
\ '-._____.-' / 
'-------------------'

Deklaration

Bei der Deklaration  einer Variablen wird dem Namen der Variablen ein Datentyp zugeordnet und es werden eventuell einige weitere Eigenschaften der Variablen festgelegt.

Da eine Variable ohne Objekt nutzlos ist, ist eine Deklaration nur sinnvoll, wenn der Variablen auf anderem Wege ein Objekt zugeordnet wird.

Variable zum Zeitpunkt 0
.----------.              .---------. 
| Variable | * 1 | Name | 
| |--------------| | 
| | | | 
| | '---------' 
| | .---------. 
| | * 1 | Eigen- | 
| |--------------| schaf- | 
| | | ten(Typ)| 
'----------' '---------'

Definition

Bei der Definition  einer Variablen wird dieser ein Objekt vom Datentyp der Variablen zugeordnet.

Der im Objekt gespeicherte Wert ist durch eine Variablendefinition im Allgemeinen nicht bestimmt. Daher kann man sich fragen, warum man von einer Definition  spricht, wenn doch der Wert gerade nicht  definiert wird. „Definition“ bezieht sich hier aber darauf, daß das Objekt  der Variablen definiert ist, nicht darauf, daß der Wert  des Objektes definiert wurde.

Variable "zahl" mit Typ "int" nach Definition
.----------.              .---------.              .---------. 
| Variable | * 1 |zahl:Name| 1 | int:Typ | 
| |--------------| ------- | .------| ------ | 
| | | | | | (z.B) | 
| | '---------' | '---------' 
| | .---------. | .---------. 
| | * 1 | Objekt |-------' 1(t)| Wert(t) | 
| |--------------| (defi- |--------------| (unbe- | 
| | | niert) |-------. | stimmt) | 
| | '---------' | '---------' 
| | .---------. | .---------. 
| | * 1 | Eigen- | | 1 | Eigen- | 
| |--------------| schaf- | '------| schaf- | 
| | | ten | | ten | 
'----------' '---------' '---------'

Initialisierung

Bei der Initialisierung  einer Variablen wird ein bestimmter Anfangszustand des Objektes der Variablen festgelegt. Die Initialisierung kann bei der Definition der Variablen erfolgen.

Ohne Initialisierung ist der Wert des Objektes unbestimmt. Das bedeutet aber nicht, daß das Objekt keinen Wert hat. Es ist nur nicht bestimmt, welchen Wert es hat.

Variable "zahl" mit Typ "int" und Initialisierung mit 12
.----------.              .---------.              .---------. 
| Variable | * 1 | zahl | 1 | int:Typ | 
| |<>------------| ---- | .------| ------ | 
| | | | | | (z.B) | 
| | '---------' | '---------' 
| | .---------. | .---------. 
| | * 1 | Objekt |-------' 1(t)| 12:Wert | 
| |--------------| |--------------| ------- | 
| | | |-------. | | 
| | '---------' | '---------' 
| | .---------. | .---------. 
| | * 1 | Eigen- | | 1 | Eigen- | 
| |<>------------| schaf- | '------| schaf- | 
| | | ten | | ten | 
'----------' '---------' '---------'

Zuweisung

Durch die Zuweisung wird der Wert des Objektes einer Variablen neu festgelegt.

Der vorherige Wert der Variablen geht dabei verloren. Insofern ist eine Zuweisung immer auch eine Löschoperation. Man sagt auch, eine Zuweisung überschreibe  den vorherigen Wert.

Der Unterschied zwischen Initialisierung und Zuweisung besteht darin, daß bei einer Initialisierung eines neuen Objektes das Objekt gleich mit dem durch die Initialisierung bestimmten neuen Wert geschaffen wird. Ohne Initialisierung wird es mit einem unbestimmten Wert geschaffen, der aber später durch eine Zuweisung verändert werden kann.

Für das folgende Beispiel einer Zuweisung wird angenommen, eine Variable habe vor der Zuweisung den Wert "12".

Variable "zahl" mit Typ "int" und Initialisierung mit 12
.----------.              .---------.              .---------. 
| Variable | * 1 |zahl:Name| 1 | int:Typ | 
| |<>------------| ------- | .------| ------ | 
| | | | | | (z.B) | 
| | '---------' | '---------' 
| | .---------. | .---------. 
| | * 1 | Objekt |-------'1(t=0)| 12:Wert | 
| |--------------| |--------------| ------- | 
| | | |-------. | | 
| | '---------' | '---------' 
| | .---------. | .---------. 
| | * 1 | Eigen- | | 1 | Eigen- | 
| |<>------------| schaf- | '------| schaf- | 
| | | ten | | ten | 
'----------' '---------' '---------'

Der Wert des Objektes werde nun durch eine Zuweisung auf 24 gesetzt.

Variable nach Zuweisung von 24
.----------.              .---------.              .---------. 
| Variable | * 1 |zahl:Name| 1 | int:Typ | 
| |<>------------| ------- | .------| ------ | 
| | | | | | (z.B) | 
| | '---------' | '---------' 
| | .---------. | .---------. 
| | * 1 | Objekt |-------'1(t=1)| 24:Wert | 
| |--------------| |--------------| ------- | 
| | | |-------. | | 
| | '---------' | '---------' 
| | .---------. | .---------. 
| | * 1 | Eigen- | | 1 | Eigen- | 
| |<>------------| schaf- | '------| schaf- | 
| | | ten | | ten | 
'----------' '---------' '---------'

Verwendung

In vielen Programmiersprachen wird verlangt, daß eine Variable vor ihrer ersten Verwendung definiert (oder wenigstens deklariert) wurde. Dadurch kann der Parser Fehler des Autors leichter entdecken. Einige Programmiersprachen erlauben es auch Variablen ohne Definition zu verwenden, wobei dann ein Typ geraten oder ein sehr allgemeiner Typ für die Variable festgelegt wird. Dies dient der Bequemlichkeit des Autors, aber ist für größere Projekte nicht geeignet, weil es Fehler fördert und die Effizienz mindert.

Bei der Verwendung einer Variablen, d.h. beim Auftreten ihres Namens (z.B. "zahl") in einem Text, steht der Name in der Regel für den Wert des Objektes.

Variable "zahl" mit dem Wert 24
                            .----------------------------. 
| (R-)Wert des Namens > | 
| | 
.----------. .---------. .---------. | 
| Variable | * 1 |zahl:Name| 1 | int:Typ | | 
| |-----------| ------- | .----| ------ | | 
| | | | | | (z.B) | | 
| | '---------' | '---------' | 
| | .---------. | .---------. | 
| | * 1 | Objekt |-----'1(t)| 24:Wert | | 
| |-----------| |----------| ------- |--' 
| | | |-----. | | 
| | '---------' | '---------' 
| | .---------. | .---------. 
| | * 1 | Eigen- | | 1 | Eigen- | 
| |-----------| schaf- | '----| schaf- | 
| | | ten | | ten | 
'----------' '---------' '---------'

Manchmal steht der Name einer Variablen jedoch für das Objekt der Variablen.

Um das zu verdeutlichen betrachten wir das Ausgaben und das Einlesen einer Variablen „x “, die zunächst den Wert "12" hat.

In dem Kommando „Gib x  aus!“ steht „x “ für den Wert  des Objektes, daher bedeutet das Kommando in diesem Fall „Gib 12 aus!“

Das Kommando „Lies x  ein!“ soll eine Zahl einlesen und diese in dem Objekt der Variablen „x “ speichern. Hier macht es aber kein Sinn den Namen der Variablen durch den Wert des Objektes zu ersetzen, denn dann erhielte man „Lies 12 ein!“, was aber nicht den gewünschten Sinn ergibt. Das Kommando „Lies x  ein!“ kann nur richtig interpretiert werden, wenn man versteht, daß der Name der Variablen „x “ hier für das Objekt steht und nicht für den Wert des Objektes. Der Programmteil zum Einlesen muß ja auch wissen, in welches Objekt der eingelesene Wert gespeichert werden soll.

Schreibweise der Zuweisung

Eine Zuweisung wird in vielen Programmiersprachen geschrieben wie z,B. "x = z".

Diese Schreibweise erinnert auch an eine mathematische Gleichung oder Definition. Doch eine Zuweisung ist etwas anderes.

Die mathematischen Gleichung x  = z “ ist die Notation der Aussage, daß der Wert „x “ dem Wert „z “ gleicht. Je nach Redezusammenhang wird diese Aussage entweder als wahr postuliert oder als eine Aussage verwendet, die wahr oder falsch sein kann.

Eine Zuweisung  "x = z" ist aber keine Aussage, sondern eine Operation, mit dem Ziel eine bestimmte Veränderung zu bewirken.

Die mathematischen Definitionen x  := 1. x  := 2.“ wären ein Verstoß gegen die Regeln einer verständlichen mathematischen Schreibweise. Denn in der Mathematik kann ein Bezeichner innerhalb eines Zusammenhangs nur einmal  definiert werden. Man wüßte nicht, ob die Variable „x “ nun gleich 1 oder gleich 2 sein soll.

Die Folge von Zuweisungen  "x = 1; x = 2; " sind in einer prozeduralen Programmiersprache aber so vollkommen sinnvoll. Hier kommt nämlich der Objektbegriff und damit der Zeitbegriff ins Spiel, den es so in der Mathematik nicht gibt: Das Objekt "x" wird eben zuerst  auf den Wert "1" gesetzt und danach  auf den Wert "2" ohne daß hierdurch ein Widerspruch entsteht.

In manchen Programmiersprachen wird versucht, den Unterschied einer Zuweisung zu ähnlichen Schreibweisen aus der Mathematik deutlich zu machen, so werden in BASIC  Zuweisungen mit durch das vorangestellte Schlüsselwort "LET" gekennzeichnet.

Interpretation der Zuweisung

Bei der Zuweisung "x = z" wird der Wert (des Objektes) der Variablen "z" (dem Objekte) der Variablen "x" zugewiesen. Das bedeute, daß der Wert (des Objektes) der Variablen "x" so verändert wird, daß er der Wert (des Objektes) der Variablen "z" wird.

Bei der Zuweisung "x = z" steht der Name der Variablen auf der linken Seite für ihr Objekt, der Name der Variablen auf der rechten Seite für den Wert  ihres Objektes.

In manchen Programmiersprachen wird dieser Sachverhalt auch ausgedrückt, indem man sagt die Variable "x" sei ein „Linkswert“ (L-value ) oder habe einen „Linkswert“ und von der Variable "z" werde in diesem Fall der „Rechtswert“ (R-value ) verwendet. Ein „Linkswert“ ist etwas, das sinnvollerweise auf der linken Seite einer Zuweisung stehen kann, also ein Objekt. Umgekehrt ausgedrückt ergibt das dann die Regel „Auf der linken Seite einer Zuweisung muß ein Linkswert stehen.“

Würde der Name auf beiden Seiten für den Wert des Objektes stehen und hätte die Variable "x" vor der Zuweisung den Wert "12" und die Variable "z" vor der Zuweisung den Wert "9", so ergäbe sich nämlich die Zuweisung "12 = 9", was offensichtlich keinen Sinn ergibt. Dies wird manchmal auch ausgedrückt, indem man sagt der Wert "12" sei kein Linkswert, er kann also nicht sinnvollerweise auf der linken Seite einer Zuweisung stehen.

Berücksichtigt man aber, daß der Name der Variablen auf der linken Seite für das Objekt  der Variablen steht, so erhält man hingegen die sinnvolle Zuweisung "x = 9".

Bei einer Zuweisung wie "x = 1 + 2" erfolgen zwei Schritte entgegen  der Leserichtung: Zuerst  wird der Wert des rechts vom Gleichheitszeichen stehenden Ausdrucks "1 + 2" ermittelt und dann  wird dieser dem links stehenden Objekt als Wert zugewiesen.

Schritte bei der Zuweisung
  2. Schritt: Zuweisung des Wertes an das 
durch die linke Seite bestimmte Objekt 
.-----------. 
| |  
| .---+---. 1. Schritt: Auswertung 
v ^ ^ der rechten Seite 
x = 1 + 2

Löschen eines Objektes

Laien haben oft die irrige Vorstellung, eine numerische Variable sei „gelöscht“, wenn man dieser den Wert "0" zugewiesen habe. Doch tatsächlich hat der Wert "0" keine besondere Bedeutung. Man könnte also genauso gut sagen, eine Variable sei „gelöscht“, wenn man ihr den Wert "22" zugewiesen habe. Aber eine Variable, die unzweifelhaft einen bestimmten Wert, wie den Wert "22", speichert als „gelöscht“ zu bezeichnen, erscheint als unpassend.

Tatsächlich ist es richtig zu sagen, daß mit jeder Zuweisung  an eine Variable, der vorherige Wert gelöscht wird. Eine Variable ist  also nie gelöscht, aber eine bestimmte Information, die früher einmal in einer Variablen war, kann inzwischen gelöscht worden sein. Will man also den derzeitigen Wert einer Variablen löschen, so kann dies dadurch erfolgen, daß man der Variablen einen beliebigen neuen Wert zuweist, aus dem kein Rückschluß mehr auf den vorherigen Wert gezogen werden kann.

Gebrauch von Variablen*

Bei Rechnungen mit Zwischenergebnissen kann für jeden Bedeutung eine eigene Variable verwendet werden. Es ist aber auch möglich eine Variable mehrfach für verschiedene Werte und daher auch mit verschiedenen Bedeutungen zu verwenden.

Übungsfrage Welches der folgenen Struktogramme gehört zu welcher der eben geschilderten Möglichkeiten? (Das Zeichenpaar ":=" steht für eine Konstantendefinition, das Zeichen "=" ohne vorangehendes Zeichen ":" für eine Zuweisung.

Rechnung B1
.--------------------------------------------------------. 
| betrag := 1,95; | 
|--------------------------------------------------------| 
| rabattfaktor := 0.97; | 
|--------------------------------------------------------| 
| mwstfaktor := 1.16; | 
|--------------------------------------------------------| 
| rabattierterbetrag := betrag * rabattfaktor; | 
|--------------------------------------------------------| 
| bruttobetrag := rabattierterbetrag * mwstfaktor; | 
|--------------------------------------------------------| 
| forderung := bruttobetrag; | 
'--------------------------------------------------------'

Rechnung B2
.--------------------------------------------------------. 
| betrag := 1,95; | 
|--------------------------------------------------------| 
| rabattfaktor := 0.97; | 
|--------------------------------------------------------| 
| mwstfaktor := 1.16; | 
|--------------------------------------------------------| 
| speicher = betrag * rabattfaktor; | 
|--------------------------------------------------------| 
| speicher = speicher * mwstfaktor; | 
|--------------------------------------------------------| 
| forderung := speicher; | 
'--------------------------------------------------------'

Übungsfrage Welcher Stil gefällt Ihnen besser?

Die erste Rechnung verwendet nur Konstanten. Daher könnte man den Stil als wertorientiert  oder mathematisch  bezeichnen. Die zweite Rechnung kann als objektverwendend  bezeichnet werden, weil sie von der typischen zeitlichen Veränderbarkeit von Objekten Gebrauch macht.

Seiteninformation und Impressum   
Formular für diese Seite betreffende Mitteilungen an den Herausgeber   
Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. slrprd, PbclevtugFgrsnaEnz