Zuweisung

Anweisung in einem Computerprogramm
(Weitergeleitet von Zuweisungsoperator)

Unter einer Zuweisung (englisch assignment) versteht man in einer imperativen Programmiersprache einen Typ von Anweisung (englisch statement), durch den eine Variable einen neuen Wert erhält. In Abgrenzung von anderen Anweisungstypen, die ebenfalls den Wert einer Variablen verändern können (zum Beispiel Aufruf einer Prozedur mit Nebeneffekten), spricht man nur dann von einer Zuweisung, wenn der Zuweisungsoperator der jeweiligen Programmiersprache verwendet wird. Viele Programmiersprachen berücksichtigen hierbei die Zuweisungskompatibilität der beteiligten Ausdrücke und Variablen, um Programmfehler zu vermeiden.

Bevor eine Zuweisung eines Wertes an eine Variable erfolgen kann, ist es in vielen Programmiersprachen erforderlich, diese explizit zu deklarieren. In manchen Programmiersprachen wird dies bei einer Zuweisung an eine noch nicht deklarierte Variable implizit ausgeführt (zum Beispiel in Perl, nicht aber in C ).

Notation

Bearbeiten

Im Folgenden sei v eine Variable und a ein Ausdruck (englisch expression). Die Beispiele zeigen einige Notationen in unterschiedlichen Programmiersprachen.

v = a
Java, C, C , C#, Python, Visual Basic .NET, PHP, JavaScript, Perl, Objective-C, Swift, Go, Ruby
v := a
Ada, ALGOL, Eiffel, Modula-2, Oberon, Pascal, Seed7, Smalltalk
set v a
Tcl
MOVE a TO v
COBOL
COMPUTE v = a
COBOL
MAKE "v :a
Logo

Syntaktische Eigenheiten

Bearbeiten

Die Zuweisung kann in den Fällen, wo sie nur mit einem einfachen Gleichheitszeichen symbolisiert wird, leicht mit dem mathematischen Gleichheitszeichen verwechselt werden. Die seit der Erfindung von FORTRAN häufig in Programmiersprachen zu findende Zuweisung zu einer Variablen mit dem Gleichheitszeichen (zum Beispiel x = y) kann daher leicht zu Irritationen oder Verwechslungen führen: die beiden Zuweisungen x = y (Zuweisung des Wertes der Variablen y zur Variablen x) und y = x (Zuweisung des Wertes der Variablen x zur Variablen y) haben jeweils eine völlig andere Bedeutung als die beiden entsprechenden booleschen Ausdrücke mit relationalen Operatoren (Vergleich auf Gleichheit von x und y), die in beiden Fällen zu einem identischen booleschen Ergebnis führen.[1]

Erschwerend kommt in einigen Programmiersprachen hinzu, dass die Zuweisung in andere Anweisungen integriert werden kann, wenn sie selber als ein Ergebniswert interpretiert werden kann. Die folgenden beiden Beispiele zeigen zwei Varianten einer entsprechenden Programmsequenz in der Programmiersprache C, die beide zu sehr leicht zu übersehenden Programmierfehlern führen kann:

int i = 0;
if (i = 1) {
    // Dieser Block wird immer ausgeführt,
    // weil die Zuweisung i = 1 immer das numerische Ergebnis 1 hat,
    // was als der boolesche Wert "wahr" interpretiert wird.
}
int i = 0;
if (i == 1) {
    // Dieser Block wird nie ausgeführt,
    // weil die Vergleichsoperation i == 1 immer das numerische Ergebnis 0 hat,
    // was als der boolesche Wert "falsch" interpretiert wird.
}

Mehrfachzuweisungen

Bearbeiten

In manchen Programmiersprachen ist es auch möglich, mehrere Zuweisungen innerhalb einer Anweisung zu formulieren. So können etwa auf der linken Seite des Zuweisungs-Operators mehrere Variablen-Namen und auf der rechten Seite mehrere Ausdrücke jeweils durch Kommata getrennt notiert werden.

v1,v2 = a1,a2         Ruby
($v1,$v2) = ($a1,$a2) Perl
[v1, v2] = [a1, a2]   JavaScript linksseitige Destrukturierung des rechtsseitigen Arrays
$v1,$v2 = $a1,$a2     Windows PowerShell
(psetf v1 a1 v2 a2)   Common Lisp

In Programmiersprachen, die Mehrfachzuweisungen unterstützen, lassen sich mit einem Konstrukt der Form

v1,v2 := v2,v1

die Werte der beiden Variablen v1 und v2 austauschen. Erlaubt eine Sprache keine Mehrfachzuweisungen, dann benötigt man im allgemeinen Fall eine Hilfsvariable, um die Inhalte zweier Variablen auszutauschen; man spricht dann von einem Dreieckstausch.

Einzelnachweise

Bearbeiten
  1. Niklaus Wirth: Good Ideas, Through the Looking Glass, Abschnitt 4.1 Notation and Syntax (PDF; 207 kB), Zürich (2005)