Operator penugasan = menyimpan nilai dari sisi kanan ke variabel di sisi kiri, lalu menghasilkan nilai yang sama sehingga bisa menyambung dengan ekspresi lain. Karena kita sering mengubah isi variabel dengan operasi yang sama berulang kali, C++ menyediakan sepuluh compound assignment: +=, -=, *=, /=, %=, &=, |=, ^=, <<=, dan >>=. Pada Chapter ini kita menguji bentuk-bentuk tersebut, membaca aturan chained assignment yang dievaluasi kanan ke kiri, dan membuktikan bahwa penugasan adalah ekspresi yang punya nilai. Perhatikan sejak sekarang: = berarti menyimpan nilai, sedangkan == yang berarti membandingkan akan kita bahas pada Chapter Operator Perbandingan.
Operator = dan Aritmetika Berulang #
Tanpa operator penugasan, sebuah program tidak bisa menyimpan hasil apa pun. Bentuk paling dasarnya adalah namaVariabel = nilai;: compiler mengevaluasi sisi kanan terlebih dahulu, kemudian menyalin hasilnya ke variabel di sisi kiri. Karena evaluasi sisi kanan berlangsung lebih dulu, penulisan hargaTotal = hargaTotal - potongan; sah — nilai lama hargaTotal dipakai untuk menghitung, lalu hasilnya menimpa variabel yang sama.
#include <iostream>
int main() {
// Operator = menyimpan nilai ke variabel
int hargaTotal = 100000;
int potongan = 25000;
hargaTotal = hargaTotal - potongan;
std::cout << "hargaTotal = " << hargaTotal << "\n";
// Compound assignment: bentuk ringkas operasi lalu simpan
int stok = 50;
stok += 12; // sama dengan stok = stok + 12
std::cout << "stok += 12 = " << stok << "\n";
stok -= 20; // sama dengan stok = stok - 20
std::cout << "stok -= 20 = " << stok << "\n";
stok *= 3; // sama dengan stok = stok * 3
std::cout << "stok *= 3 = " << stok << "\n";
stok /= 7; // sama dengan stok = stok / 7
std::cout << "stok /= 7 = " << stok << "\n";
stok %= 20; // sama dengan stok = stok % 20
std::cout << "stok %= 20 = " << stok << "\n\n";
// Chained assignment: dievaluasi kanan ke kiri
int a = 0;
int b = 0;
int c = 0;
a = b = c = 7;
std::cout << "a = " << a << ", b = " << b << ", c = " << c << "\n\n";
// Assignment menghasilkan nilai
int x = 0;
int y = 0;
y = (x = 5) + 10; // (x = 5) bernilai 5
std::cout << "x = " << x << ", y = " << y << "\n";
return 0;
}Output yang Dihasilkan:
hargaTotal = 75000
stok += 12 = 62
stok -= 20 = 42
stok *= 3 = 126
stok /= 7 = 18
stok %= 20 = 18
a = 7, b = 7, c = 7
x = 5, y = 15Mari kita bedah bagian pentingnya:
- Baris 6-8 (
hargaTotal = hargaTotal - potongan;): sisi kanan100000 - 25000dievaluasi menjadi75000, lalu hasilnya disimpan kehargaTotal. Variabel yang sama muncul di dua sisi, dan itu sah. - Baris 12-21 (compound assignment):
stok += 12persis sama artinya denganstok = stok + 12. Urutan hasilnya62 → 42 → 126 → 18 → 18, satu rantai perubahan pada variabel yang sama. - Baris 26 (
a = b = c = 7;): chained assignment. Penugasan bersifat kanan-ke-kiri (right-associative), sehingga compiler membacanya sebagaia = (b = (c = 7));—cdiisi7dulu, hasilnya diteruskan keb, lalu kea. - Baris 32 (
y = (x = 5) + 10;): ekspresi(x = 5)menyimpan5kexsekaligus menghasilkan nilai5, sehinggaymenerima5 + 10yaitu15.
Tabel Compound Assignment #
Setiap compound assignment memiliki pola a op= b yang setara dengan a = a op b, dengan a hanya dievaluasi satu kali.
| Operator | Contoh | Setara dengan | Keterangan |
|---|---|---|---|
+= | stok += 12 | stok = stok + 12 | tambah lalu simpan |
-= | stok -= 20 | stok = stok - 20 | kurang lalu simpan |
*= | stok *= 3 | stok = stok * 3 | kali lalu simpan |
/= | stok /= 7 | stok = stok / 7 | bagi lalu simpan |
%= | stok %= 20 | stok = stok % 20 | modulo lalu simpan |
&= | flag &= mask | flag = flag & mask | bitwise AND |
|= | flag |= mask | flag = flag | mask | bitwise OR |
^= | flag ^= mask | flag = flag ^ mask | bitwise XOR |
<<= | n <<= 2 | n = n << 2 | geser kiri |
>>= | n >>= 2 | n = n >> 2 | geser kanan |
Empat baris terakhir bekerja pada bit sehingga baru terasa gunanya setelah kita mempelajari operator bitwise pada Chapter Operator Bitwise. Untuk sekarang, cukup catat polanya: simbol operasi ditulis lebih dulu, diikuti = tanpa spasi di antara keduanya.
Penugasan adalah Ekspresi #
Berbeda dari sebagian bahasa lain yang memperlakukan penugasan sebagai pernyataan (statement), di C++ penugasan adalah ekspresi. Ia menghasilkan nilai dari variabel setelah disimpan, dan itulah yang membuat chained assignment a = b = c = 7; bekerja: nilai kembalian (c = 7) menjadi operand bagi penugasan b = .... Kesadaran ini penting saat kita membaca kode orang lain, karena penugasan bisa muncul di tengah ekspresi yang lebih besar.
Sekali lagi ingat pasangan yang sering tertukar: = menyimpan nilai, == membandingkan dua nilai. Chapter berikutnya membahas == dan sahabat-sahabatnya — operator perbandingan yang menghasilkan nilai bool.