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.

cpp
#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:

text
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 = 15

Mari kita bedah bagian pentingnya:

  1. Baris 6-8 (hargaTotal = hargaTotal - potongan;): sisi kanan 100000 - 25000 dievaluasi menjadi 75000, lalu hasilnya disimpan ke hargaTotal. Variabel yang sama muncul di dua sisi, dan itu sah.
  2. Baris 12-21 (compound assignment): stok += 12 persis sama artinya dengan stok = stok + 12. Urutan hasilnya 62 → 42 → 126 → 18 → 18, satu rantai perubahan pada variabel yang sama.
  3. Baris 26 (a = b = c = 7;): chained assignment. Penugasan bersifat kanan-ke-kiri (right-associative), sehingga compiler membacanya sebagai a = (b = (c = 7)); — c diisi 7 dulu, hasilnya diteruskan ke b, lalu ke a.
  4. Baris 32 (y = (x = 5) + 10;): ekspresi (x = 5) menyimpan 5 ke x sekaligus menghasilkan nilai 5, sehingga y menerima 5 + 10 yaitu 15.

Tabel Compound Assignment #

Setiap compound assignment memiliki pola a op= b yang setara dengan a = a op b, dengan a hanya dievaluasi satu kali.

OperatorContohSetara denganKeterangan
+=stok += 12stok = stok + 12tambah lalu simpan
-=stok -= 20stok = stok - 20kurang lalu simpan
*=stok *= 3stok = stok * 3kali lalu simpan
/=stok /= 7stok = stok / 7bagi lalu simpan
%=stok %= 20stok = stok % 20modulo lalu simpan
&=flag &= maskflag = flag & maskbitwise AND
|=flag |= maskflag = flag | maskbitwise OR
^=flag ^= maskflag = flag ^ maskbitwise XOR
<<=n <<= 2n = n << 2geser kiri
>>=n >>= 2n = n >> 2geser 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.