augmented assignment (tsz. augmented assignments)
A sima értékadás:
a = a + b;
Bővített (augmented) változata:
a += b;
Ez nem csak rövidebb, hanem gyakran hatékonyabb is, mert a fordító optimalizálhatja.
C++ nyelvben a következő augmented assignment operátorokat ismerjük:
Operátor | Jelentés | Példa | ||
---|---|---|---|---|
+=
|
összeadás + értékadás | a += b;
|
||
-=
|
kivonás + értékadás | a -= b;
|
||
*=
|
szorzás + értékadás | a *= b;
|
||
/=
|
osztás + értékadás | a /= b;
|
||
%=
|
maradékos osztás | a %= b;
|
||
<<=
|
biteltolás balra | a <<= 2;
|
||
>>=
|
biteltolás jobbra | a >>= 2;
|
||
&=
|
bitenkénti ÉS | a &= b;
|
||
` | =` | bitenkénti VAGY | `a | = b;` |
^=
|
bitenkénti XOR | a ^= b;
|
Példa:
int a = 5;
a += 3; // ugyanaz, mint: a = a + 3;
Fordításkor ez rövidebb assembly utasításokká alakulhat, mint ha külön értékadást és műveletet írnánk.
+=
)C++-ban saját típusokra is írhatunk augmented assignment operátort:
class Vec2 {
public:
int x, y;
Vec2(int x=0, int y=0): x(x), y(y) {}
Vec2& operator+=(const Vec2& rhs) {
x += rhs.x;
y += rhs.y;
return *this;
}
};
Használat:
Vec2 a(1, 2), b(3, 4);
a += b; // a == (4, 6)
for (int i = 0; i < 10; i += 2)
flags |= 0x01; // kapcsoló beállítása
int i = 0;
arr += 5;
a += b * c
→ a = a + (b * c)
(nem a = (a + b) * c
).a
vagy b
egy függvényhívás, értékelési sorrendre figyelni kell.return *this
), különben nem működik jól a láncolás (a += b += c
).mutable
.
A legtöbb STL típus támogatja az augmented operátorokat:
std::string s = "Hello ";
s += "World"; // "Hello World"
std::vector<int> v1 = {1, 2};
std::vector<int> v2 = {3, 4};
// v1 += v2; // NEM működik, mivel nincs definiálva erre az operátor
Ha szükséges, saját overloadot írhatunk, pl.:
template <typename T>
std::vector<T>& operator+=(std::vector<T>& lhs, const std::vector<T>& rhs) {
lhs.insert(lhs.end(), rhs.begin(), rhs.end());
return lhs;
}