Zuweisungen
Eine Zuweisung ist ein Sprachelement, dessen Wirkung das Schreiben eines Wertes in einen Wertspeicher ist. Man sagt auch der Wert werde dem Wertspeicher zugewiesen. Damit geht einher, daß der Wertspeicher keine Information mehr über seinen vorherigen Wert enthält (selbst, wenn der zugewiesene Wert dem vorherigen Wert gleich ist).
Die Möglichkeit der Verwendung einer Zuweisung zur Veränderung des Wertes eines Wertspeichers ist der entscheidende Unterschied der Wertspeicher zu den Konstanten (benannten Werten): Der Wert einer Konstante wird einmal bei ihrer Deklaration festgelegt und kann danach nicht mehr verändert werden.
Eine Zuweisung wird allgemein so formuliert, daß der Angabe eines Wertspeichers ein nach links weisender Pfeil und ein Ausdruck nachgestellt wird.
v ← 32
Die Wirkung der Zuweisung besteht dann darin, daß der neue Wert des Wertspeichers der in den Typ des Wertspeichers gewandelte Wert des Ausdrucks ist, falls solch eine Wandlung möglich ist.
Der erste ASCII von 1963 enthielt sogar solch einen nach links weisenden Pfeil, aber spätere Versionen des ASCII enthielten keinen solchen Pfeil mehr. Vielleicht liegt es an der geringen Verfügbarkeit dieses Zeichens im 20. Jahrhundert, daß viele Programmiersprachen diese schöne Schreibweise für die Zuweisung so nicht direkt verwenden. Trotzdem kann es aber hilfreich sein, sich eine Zuweisung in dieser Weise vorzustellen.
Tatsächlich verwenden viele Programmiersprachen anstelle des Pfeiles das Gleichheitszeichen "=" oder das Definitionszeichen ":=" in einer Hintereinanderschreibung aus einem Doppelpunkt und einem Gleichheitszeichen.
Diese Schreibweisen einer Zuweisung erinnern 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 die Anweisung für eine Aktion, 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 Kontexts (Text-Zusammenhangs) nur einmal definiert werden. Man wüßte nicht, ob die mathematische 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 Wertspeicher-Begriff und damit der Zeitbegriff ins Spiel, den es so in der Mathematik nicht gibt: Der Wertspeicher "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 durch das vorangestellte Schlüsselwort "LET" gekennzeichnet.
Interpretation der Zuweisung
Der Einfachheit halber wird nun angenommen, der Wertspeicher "v" und der Wertspeicher "w" hätten beide denselben Typ. Dann bewirkt die Zuweisung "v = w", daß der Wert des Wertspeichers "w" in den Wertspeicher "v" geschrieben (kopiert) wird.
Bei der Zuweisung "v = w" steht der Name des Wertspeichers auf der linken Seite für den Wertspeicher "v" selber, der Name des Wertspeichers auf der rechten Seite aber für den Wert des Wertspeichers "w".
In manchen Programmiersprachen wird dieser Sachverhalt auch ausgedrückt, indem man sagt der Wertspeicher "v" sei ein „Linkswert“ (L-value ) oder habe einen „Linkswert“. Ein „Linkswert“ ist etwas, das sinnvollerweise auf der linken Seite einer Zuweisung stehen kann, also etwas, das einen Wertspeicher bezeichnet. Umgekehrt ausgedrückt ergibt das dann die Regel „Auf der linken Seite einer Zuweisung muß ein Linkswert stehen.“ (In C und C++ ist die Bezeichnung „Linkswert“ üblich, während man in Java hier von einer „Variablen“ spricht.)
Der Wertspeicher "w" wird in der Zuweisung "v = w" als „Rechtswert“ (R-value ) verwendet, das heißt, daß sein Wert verwendet wird.
Würde der Name auf beiden Seiten für den Wert der Wertspeicher stehen und hätte der Wertspeicher "v" vor der Zuweisung den Wert "12" und der Wertspeicher "w" 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. Auf der linken Seite der Zuweisung muß eben ein Wertspeicher stehen. Berücksichtigt man aber, daß der Name des Wertspeichers auf der linken Seite für den Wertspeicher "v" steht, so erhält man hingegen die sinnvolle Zuweisung "v = 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 Wertspeichers
Laien haben oft die irrige Vorstellung, ein numerischer Wertspeicher sei „gelöscht“, wenn man diesem den Wert "0" zugewiesen habe. Doch tatsächlich hat der Wert "0" keine besondere Bedeutung. Man könnte also genauso gut sagen, ein Wertspeicher sei „gelöscht“, wenn man ihm den Wert "22" zugewiesen habe. Aber einen Wertspeicher, der unzweifelhaft einen bestimmten Wert, wie den Wert "22" oder den Wert "0", speichert als „gelöscht“ zu bezeichnen, erscheint als unpassend.
Tatsächlich ist es richtig zu sagen, daß mit jeder Zuweisung an einen Wertspeicher, der vorherige Wert gelöscht wird. Eine Wertspeicher ist also nie gelöscht, aber eine bestimmte Information, die früher einmal in einem Wertspeicher war, kann inzwischen gelöscht worden sein. Will man also den derzeitigen Wert eines Wertspeichers löschen, so kann dies dadurch erfolgen, daß man dem Wertspeicher einen beliebigen neuen Wert zuweist, aus dem kein Rückschluß mehr auf den vorherigen Wert gezogen werden kann.