Variablenoperationen

Einführung

In der letzten Mission haben Sie die Basisdatentypen kennen gelernt. Weiterhin haben Sie sich mit der ersten Operation vertraut gemacht mit dem man Werte einer Variable verändern kann: dem Zuweisungsoperator =:

int i = 3;	//1: i wird mit 3 initialisiert
i = 5;		//2: i wird der Wert 5 zugewiesen
int j = 2;	//3: j wird mit 2 initialisiert
i = j;		//4: i wird der Wert von j also 2 zugewiesen

Die Operatoren

Nun beschränkt sich das Verändern von Werten natürlich nicht auf das schlichte Neuzuweisen von Parametern. Zum einen sind alle 4 Grundrechenarten definiert. Somit lassen sich 2 Werte miteinander addieren, subtrahieren , multiplizieren, dividieren und dann schließlich einer Variable zuweisen:

Operation Operator Anwendung Beschreibung Beispiel
Addition + c = a + b; c wird die Summe aus a und b zugewiesen c = 4 + 2; -> c = 6;
Subtraktion  - c = a - b; c wird die Differenz aus a und b zugewiesen c = 4 - 2; -> c = -1;
Multiplikation * c = a * b; c wird das Produkt aus a und b zugewiesen c = 4 * 2; -> c = 8;
Division / c = a / b; c wird der Quotient aus a und b zugewiesen c = 4 / 2; -> c = 2;
Modulo  % c = a % b; c wird der Rest aus a und b zugewiesen c = 4 % 2; -> c = 0;

Diese vier Grundrechenarten und die Modulooperation sind auf relativ einfache Weise definiert. Ich denke die Operation benötigen keinen weiteren Erklärungsbedarf. Sie lassen sich auch kombinieren. Dabei gelten alle mathematischen Grundsätze (Punkt- vor Strichrechnung). Möchte man dennoch eine Summe mit einem Faktor multiplizieren sind Klammern erforderlich:

int i = 3 * 4 + 1;  -> i = 12 + 1; -> i = 13;
int i = 3 * (4 + 1) -> i = 3 * 5;  -> i = 15;

In C++ (in Java auch) gibt es noch gewisse besondere Operationen, welche aus den obigen abgeleitet werden. Sie verkürzen die bisher bekannten. In der folgenden Tabelle ist ihre Anwendung und deren Entsprechung aufgezeigt:

Operation Operator Anwendung Entsprechung / Bedeutung  Beispiel
Addition += c += a; c = c + a; (c wird um a erhöht) c = 1; c += 2; -> c = 3;
Subtraktion -= c -= a; c = c - a; (c wird um a verringert) c = 2; c -= 1; -> c = 1;
Multiplikation *= c *= a; c = c * a; (c wird um a vervielfacht) c = 2; c *= 2; -> c = 4;
Division /= c /= a; c = c / a; (c wird durch a dividiert) c = 4; c /= 2; -> c = 2;
Modulo %= c %= a; c = c % a; (c erhält den Rest von c / a); c = 1; c %= 2; -> c = 1;
Inkrementieren ++ c++; ++c; c = c + 1; (c wird um 1 erhöht) c = 0; c++; -> c = 1;
Dekrementieren -- c--; --c; c = c - 1; (c wird um 1 verringert) c = 0; c--; -> c = -1;

Diese Operationen mögen anfangs ein wenig gewöhnungsbedürftig sein, sie prägen sich jedoch schnell ein. Auffällig wird das Inkrementiern und das Dekrementieren erscheinen. Es gibt zwei verschiedene Anwendungsmöglichkeiten. Einmal als Postfix (c++ bzw. c--) und einmal als Präfix (++c bzw. --c).  Schreibt man sie als einzelne Anweisung so gibt es keinen Unterschied. Betrachten folgende Operationen:

int i = 0, j = 0;	//1
i++; ++j;		//2: -> i = 1; j = 1;
i += (++j);		//3: -> j = 2; i += 2; -> i = 3;
i = j = 1;		//4
i += (j++);		//5: -> i += 1 -> i = 2; j = 2;

Bei einer Kombination mit einer Postfixoperation wird die Postfixoperation zuletzt ausgeführt. Bei einer Präfixoperation wird erst diese ausgeführt. In unserem Beispiel ändert dich der Wert von i von 3 auf 2. Sollten Sie mit solchen Kombinationen Probleme haben schreiben Sie es lieber in 2 Zeilen.

Bitoperatoren

Neben den oben genannten Operationen gibt es noch weitere sogenannte Bitoperationen. Dazu sollte ihn zunächst geläufig sein wie man Dezimalzahlen in Binärzahlen umwandelt. Angenommen sie haben die Zahl 10 im Dezimalsystem und Sie wollen sie in das Binärsystem umwandeln, so ist dies 1010 (lies eins-null-eins-null), da 0 * 2 ^ 0 + 1 * 2 ^ 1 + 0 * 2 ^ 2 * 1 * 2 ^ 3 = 0 + 2 + 0 + 8 = 10 ist. Wenn Ihnen diese Umwandlung (welche sich übrigens mit dem Windowstaschenrechner vornehmen lässt) zu unverständlich ist, möchte ich anmerken, dass die Bitoperationen, welche mit Binärzahlen arbeiten, zwar in C++ definiert sind (und das darauf alle 4 Grundrechenarten aufbauen) Sie sie aber nicht zwingend für Ihre Programme benötigen. Ich werde Sie hier der Vollständigkeit halber dennoch hier anbringen. Sie haben Speziell in der Programmierung in denen Sie mit Grafik zu tun haben, eine wesentliche Bedeutung. Ich führe sie hier erst einmal auf:

Ein Bit kann entweder gesetzt (1) oder nicht gesetzt (0) sein. Die Bitoperationen wirken sich auf den jeweiligen Status eines jeden Bits aus, d.h. sie durchlaufen alle Bits einer Zahl und ändern deren Bits mithilfe des für die Operation anzuwendende "logische Gatter". Diese Gatter zeigen alle Kombinationen auf, die bei einer solchen Operation auftreten können. Ich werde die Bitoperationen im folgenden anhand ihrer logischen Gatter aufzeigen und Ihnen ihre Verwendung verdeutlichen:

Operation Operator Anwendung
NOT ~ b = ~a;
AND & c = a & b;
OR | c = a | b;
XOR ^ c = a ^ b;

Das NOT-Gatter:

B = ~A;

A B = ~A
1 0
0 1

alle Bits werden einfach invertiert! Beispiel: ~010 = ~...0002 = ...1112 = -110.

Das AND-Gatter:

C = A & B;

A B C = A & B
1 0 0
1 1 1
0 0 0
0 1 0

Ein Bit ist nur dann 1 wenn beide Bits 1 sind! Beispiel: 1010 & 110 = 10102 & 00012 = 00002 = 010.

Das OR-Gatter:

C = A | B;

A B C = A | B
1 0 1
1 1 1
0 0 0
0 1 1

Ein Bit ist nur dann 0 wenn beide Bits 0 sind! Beispiel: 1010 | 110 = 10102 | 00012 = 10112 = 1110.

Das XOR-Gatter:

C = A ^ B;

A B C = A ^ B
1 0 1
1 1 0
0 0 0
0 1 1

Ein Bit ist nur dann 1 wenn ein Bit 1 und das andere 0 ist! Beispiel: 1010 ^ 110 = 10102 ^ 00012 = 10112 = 1110.

Desweiteren gibt es die sogenannten Shiftoperatoren '<<' und '>>'. Sie schieben eine Bitfolge nach links ('<<') oder nach rechts ('>>'), wobei alle Bits die hinzukommen durch 0en ersetzt werden. Beispiel: 210 << 310 = 102 << 310 = 100002 = 1610 bzw. 210 >> 310 = 102 >> 310 = 02 = 010.

Alle Bitoperation besitzen genauso wie die 4 Grundrechenarten die Verkürzungen:

Operation Operator Anwendung Entsprechung / Bedeutung 
AND &= c &= a; c = c & a;
OR |= c |= a; c = c | a;
XOR ^= c ^= a; c = c ^ a;
lshift <<= c <<= a; c = c << a; (um a Bits nach links verschieben)
rshift >>= c >>= a; c = c << a; (um a Bits nach rechts verschieben)

Für die nächsten Lektionen

In dieser Lektion sollten Ihnen die aufgeführten Operationen, zumindest die 4 Grundrechenarten und deren Verwendung ein Begriff sein. In der nächsten Lektion  gehen wir näher auf den Datentyp 'bool' ein. Dafür sind die Gatter, welche wir eben betrachtet haben, nicht unwesentlich.

Zurück Nach oben Weiter