Verbundzuweisungen in C++
Relative Zuweisungen
Durch eine Zuweisung an ein Objekt wird der bisherige Wert des Objektes überschrieben. Der bisherige Wert beeinflußt den Wert nach der Zuweisung also nicht.
Schon in der Umgangssprache verwendet man aber oft Formulierungen für relative Typen von Wertveränderung, etwa, wenn man sagt „mein Kontostand hat sich um 1002 Euro erhöht“ oder „mein Alter hat sich seitdem verdoppelt“.
In C++ gibt es Operatoren für solche relativen Änderungen von Werten. Wenn eine Variable "x" um 1002 erhöht werden soll, so läßt sich dies beispielsweise durch den Wirkausdruck "x += 1002" schreiben. Dieser ist eine Abkürzung für den Wirkausdruck "x = x + 1002" mit dem Unterschied, daß bei der relativen Zuweisung "x += 1002" der Teilausdruck "x" nur einmal ausgewertet wird. Wegen der damit einhergehenden höheren Effizienz und der kompakteren Formulierung, soll die relative Zuweisung wann immer möglich bevorzugt verwendet werden.
Als Abkürzung für Ausdrücke der Form "L = L + R " dient die Zuweisung "L += R " mit dem speziellen Operator "+=", bei der der Ausdruck "L " nur einmal ausgewertet wird. Auch für einige andere binäre Operatoren sind solche Kurzformen der Zuweisung definiert. Die verschiedenen Zuweisungsoperatoren können der folgenden Produktion entnommen werden.
- vereinfachte Syntax
Ausdruck
.----------. .--. .--------.
--->| Ausdruck |--->( += )-->|Ausdruck|--->
'----------' '--' '--------'Ausdruck
.----------. .--. .--------.
--->| Ausdruck |--->( -= )-->|Ausdruck|--->
'----------' '--' '--------'Ausdruck
.----------. .--. .--------.
--->| Ausdruck |--->( *= )-->|Ausdruck|--->
'----------' '--' '--------'Ausdruck
.----------. .--. .--------.
--->| Ausdruck |--->( /= )-->|Ausdruck|--->
'----------' '--' '--------'relativ.cpp
#include <iostream>
#include <ostream>
int main()
{ auto i = 0;
i += 1;
std::cout <<( i += 1 )<< '\n';
std::cout << i << '\n'; }std::cout
2
2
Effizienz
Bei der Berechnung von a+(b+c) mit Zeichenfolgen müssen zusätzliche Zeichenfolgen-Objekte für Zwischenergebnisse angelegt werden und Daten müssen in diese kopiert werden. In bestimmten Fällen kann es effizienter sein, solche Berechnungen in eine Folge von Schritten mit »+=« aufzuteilen, falls im konkreten Einzelfalls dafür nicht ebenfalls neue Variablen für Zwischenergebnisse angelegt werden müssen.
main.cpp
#include <iostream>
#include <ostream>
#include <string>using namespace ::std::literals;
int main()
{ auto const a { "alpha"s };
auto const b { "beta"s };
auto const c { "gamma"s };
auto const result { a + b + c };
::std::cout << result << "\n"s; }Protokoll
alphabetagamma
Das folgende Programm könnte effizienter sein:
main.cpp
#include <iostream>
#include <ostream>
#include <string>using namespace ::std::literals;
int main()
{ auto result { "alpha"s };
auto const b { "beta"s };
auto const c { "gamma"s };
result += b;
result += c;
::std::cout << result << "\n"s; }Protokoll
alphabetagamma