Belajar Bahasa C sharp/Bab III

Dari Wikibuku bahasa Indonesia, sumber buku teks bebas
Bab III: Perhitungan Aritmetika dalam C# dan Operator

Dalam beberapa contoh pada bab sebelumnya, kita telah mengenal beberapa hal, tetapi masalah aritmetika/matematika dasar di dalam contoh di atas hanya dibahas satu buah saja, yakni penjumlahan. Padahal, sebenarnya banyak program komputer yang harus mampu melakukan kalkulasi dalam berbagai macam bentuk, selain tentunya penjumlahan. Dari contoh-contoh di atas, mungkin kita telah bisa memahami bagaimana caranya menambahkan dua bilangan atau lebih dengan menggunakan bahasa C#, tapi bagaimana dengan operasi lainnya, seperti perkalian, pembagian, dan pengurangan?

Penjumlahan dan Pengurangan[sunting]

Penjumlahan memang hal yang paling mudah untuk dilakukan di dalam bahasa C#, karena memang kita belajar dari contoh-contoh pada bab-bab sebelumnya. Ya, penjumlahan di dalam bahasa C# disimbolkan dengan menggunakan tanda plus (+)! Jika variabel A, B, dan C dideklarasikan sebagai integer, maka untuk mencari nilai C yang merupakan hasil penjumlahan antara A dan B adalah sebagai berikut:

C= A + B;

Pengurangan juga sama mudahnya seperti penjumlahan. Yakni dengan menggunakan simbol strip (-) sebagai tanda untuk mengurangi dua buah bilangan.

C= A - B;

Simbol plus dan strip di atas merupakan contoh dari operator aritmetika. Kedua operator tersebut juga dapat dikategorikan sebagai operator biner (binary operator), karena memang keduanya memiliki dua buah operand (operand pertama adalah yang berada di sebelah kiri simbol, sementara operator kedua berada di sebelah kanan simbol). Sebuah operand dapat berupa ekspresi tertentu, dan ekspresi tersebut dapat berupa sebuah variabel, literal numerik, atau hasil dari operasi lainnya.

Kita juga bisa menggunakan kedua simbol di atas secara sekaligus, sebagai operator unary (unary operator, yang memiliki satu buah operand saja). Daripada harus menuliskan bentuk seperti:

C = A - B;

kita juga bisa menuliskan:

C = A + -B;

atau dalam bentuk:

C= -B + A;

Pada bentuk pertama dari tiga bentuk pernyataan di atas, tanda strip di atas merupakan tanda untuk operasi pengurangan, yang melibatkan dua buah operand, yakni A dan B, sehingga tanda minus tersebut dinamakan pula dengan operator binary. Pada bentuk kedua dan ketiga, tanda strip tersebut berarti menegatifkan sebuah nilai, yakni nilai B. Kedua statemen tersebut akan menambahkan nilai A (positif) dengan nilai negatif dari B. Karena setelah tanda tersebut hanya terdapat satu buah operand, maka operator tersebut termasuk ke dalam kategori operator unary. Operator unary sendiri tidak mengubah nilai B, akan tetapi hanya mengubah nilai yang digunakan pada saat penjumlahan.

Tanda plus, yang merupakan sebuah operator binary yang biasa digunakan untuk melakukan operasi penjumlahan, bisa juga digunakan sebagai operator unary seperti di bawah ini:

C = +A - +B;

Tanda operator plus di sana terlihat aneh dan, karenanya, oleh para desainer C# di Microsoft dibuat agar tidak memiliki efek pada variabel/nilai yang mengikutinya. Lagi pula, jika memang membingungkan, dan tidak berguna, maka saya juga tidak akan menuliskan bentuk seperti di atas lagi di dalam tulisan-tulisan saya selanjutnya mengenai C#. Ini adalah waktu terakhir Anda melihatnya!

Perkalian[sunting]

Nah, penjumlahan dan pengurangan sudah dibahas, akan tetapi bagaimana dengan perkalian? Padahal, di dalam matematika, kita mengetahui bahwa simbol perkalian adalah × (Unicode 007D), dan simbol tersebut tidak terdapat di dalam keyboard yang kita gunakan. Terus bagaimana digunakannya? Dalam sebagian besar bahasa pemrograman populer, kita bisa menggunakan karakter asterisk (*), dan kita bisa menggunakannya sebagai operator untuk perkalian. Dibanding kita menggunakan bentuk:

Luas = Panjang × Lebar;

Kita bisa menggunakan bentuk:

Luas = Panjang * Lebar;

Ingat, sebagian besar bahasa pemrograman menggunakan karakter asterisk sebagai simbol perkalian, bukan hanya C# saja. Dan daripada menyebutnya dengan sebutan yang agak susah, para programmer di luar negeri pun menyebutnya dengan sebutan star saja. Kita juga sama deh! Kita sebut karakter asterisk sebagai karakter bintang, karena lebih mudah digunakan dan diingat. Oke?

Pembagian dan Sisa Hasil Bagi[sunting]

Papan ketik yang kita gunakan juga mungkin tidak memiliki tanda untuk pembagian yang kita kenal yakni ÷ (Unicode 00F7). Akan tetapi, sama seperti halnya perkalian yang menggunakan tanda bintang sebagai pengganti simbol ÷, pembagian juga menggunakan karakter pengganti, yakni garis miring maju, atau slash! (/) Sehingga, kita bisa menuliskan bentuk Jam=Menit ÷ 60, dalam C# menjadi:

Jam = Menit / 60;

Di antara semua operasi aritmetika dasar, mungkin semua orang akan setuju bila saya mengatakan bahwa pembagian adalah operasi yang paling rumit dilakukan. Komputer pun sama bodohnya, karena memang komputer lebih bodoh dibandingkan dengan kita! Tidak seperti operasi lainnya terhadap bilangan bulat yang "adem-adem" saja, pembagian terhadap dua buah bilangan bulat memiliki kerumitan tersendiri yang tidak kita bisa abaikan. Oke, jika tidak percaya mungkin potongan kode ini bisa dijadikan sebagai demonstrasi:

int JumlahKue, JumlahOrang, Bagian;
JumlahKue = 11;
JumlahOrang = 4;

Bagian= JumlahKue / JumlahOrang;

Oke, berapa nilai akhir dari variabel Bagian? Jawabannya pasti bukan 2.75! Variabel Bagian tidak dapat bernilai 2.75 karena kita tahu bahwa pada deklarasi variabel di atas, variabel Bagian memiliki tipe data bilangan bulat (integer). Kata kunci int sama sekali tidak bisa mengakomodir pecahan, yang berarti jika memang kita membutuhkan hasil dalam bentuk pecahan, kita harus mencari pendekatan lainnya (yang nanti akan dibahas)!

Sebenarnya, variabel Bagian yang dideklarasikan sebagai integer bukanlah menjadi masalah di sini. Masalahnya sebenarnya terdapat pada tanda sama dengan (=) yang digunakan di dalam operasi, yakni pada sebelah kanan tanda sama dengan tersebut. Variabel JumlahKue dan JumlahOrang juga dideklarasikan sebagai integer, dan di dalam C#, semua operasi antara dua buah integer akan menghasilkan integer pula.

Saat C# membagi dua buah bilangan bulat, maka C# akan memotong hasilnya, yang berarti bagian pecahannya akan dibuang begitu saja (tidak akan dianggap)! Hasil dari pembagian antara 11 dan 4 bukanlah 2.75, karena nilai 0.75 akan dibuang dan nilai akhir dari pembagian tersebut adalah 2. Berarti, setiap orang mendapatkan dua buah kue, dan secara logika masih tersisa tiga buah kue yang tidak dibagikan untuk siapa-siapa.

Oke, sekarang lihat contoh di bawah ini:

int JumlahKue, JumlahOrang, Bagian;

JumlahKue = 11;
JumlahOrang = 12;

Bagian= JumlahKue/JumlahOrang;

Berapa nilai akhir dari variabel Bagian? Jawabannya adalah 0, karena jumlah orang terlalu banyak jika dibandingkan dengan jumlah kuenya, akhirnya ibu dapur pun tidak membaginya, sehingga 12 orang pun akhirnya "kelaparan."

Pemotongan pun berlaku untuk angka negatif:

A = -3;
B = 2;

C = A / B;

Jika saja semua bilangan tersebut dianggap bukan sebagai bilangan bulat, maka hasilnya adalah -1.5, tapi C# akan membuang pecahan ½ tersebut, dan hasil akhirnya adalah -1. Pemotongan dalam kasus-kasus ini pun kadang disebut sebagai "pembulatan".

Untungnya, bahasa C# menawarkan operator lainnya yang mengizinkan kita untuk "menyelamatkan" sisa pembagian tersebut, sehingga bisa "dimanfaatkan". Operator ini dinamakan juga dengan modulus operator, atau operator sisa. Dalam C#, operator modulus menggunakan simbol persen (%), sebuah simbol yang pada dasarnya mengandung karakter garis miring (slash) sehingga menjadikannya berhubungan dengan pembagian. Oke deh, kita modifikasi program di atas menjadi seperti ini:

int JumlahKue, JumlahOrang, Bagian;

JumlahKue = 11;
JumlahOrang = 4;

Bagian= JumlahKue/JumlahOrang;

int Sisa;
Sisa = JumlahKue % JumlahOrang;

Sebelas kue dibagi ke empat orang menghasilkan setiap orang mendapatkan dua buah kue utuh, dan sisanya ada tiga buah kue yang tidak digunakan. Saat menggunakan operator modulus terhadap bilangan negatif, hasilnya pun selalu memiliki tanda yang sama dengan nilai yang ditaruh di samping kiri dari operator modulus tersebut (jika positif maka hasil akhirnya akan positif dan bila negatif, maka hasil akhirnya juga negatif).

Operator modulus akan sangat berguna untuk melakukan beberapa pekerjaan tertentu, karena operator ini dapat membagi sebuah angka yang mungkin nantinya akan lebih rumit jika menggunakan operator pembagian biasa. Sebagai contoh, anggaplah kita memiliki sebuah variabel dengan nama Tahun4Digit, yang menyimpan angka seperti 1968, 1985, atau 2008. Jika kita hendak mengubahnya menjadi tahun dengan panjang dua digit, dengan nama variabel Tahun2Digit (seperti 68, 85, atau 08), maka kita bisa melakukannya dengan cara:

Tahun2Digit = Tahun4Digit % 100;

Variabel Tahun2Digit adalah angka sisa pembagian setelah kita membagi variabel Tahun4Digit dengan angka 100. Nilainya akan selalu merupakan angka antara 0 hingga 99.

Contoh lainnya: anggaplah kita memiliki variabel dengan nama MenitTotal, yang mungkin mengandung total menit berjalannya sebuah film di bioskop. Jika memang kita hendak memisahkan nilai tersebut ke dalam bentuk Jam:Menit yang merupakan bentuk bilangan bulat, maka kita bisa gunakan:

Jam = MenitTotal / 60;
Menit = MenitTotal % 60;

Jika variabel MenitTotal bernilai 135, maka Jam akan bernilai 2, dan Menit akan bernilai 15. Hasil dari variabel Menit pasti akan selalu memiliki nilai 0 hingga 59.

Operator modulus juga bisa sangat berguna untuk menentukan apakah sebuah angka bisa habis dibagi oleh angka lainnya. Sebagai contoh, kita tahu bahwa tahun kabisat adalah tahun yang habis dibagi dengan empat, dan akan muncul setiap empat tahun sekali. Dengan demikian, jika ekspresi Tahun % 4 memiliki nilai 0, maka tahun tersebut merupakan tahun kabisat. Betul tidak?

Beberapa masalah dalam pembagian[sunting]

Di atas, saya mungkin menyebutkan "kerumitan dalam pembagian". Maksudnya apa sih? Selain dua masalah di atas, pembagian memiliki beberapa kerumitan lagi, di antaranya adalah sebagai berikut:

int A, B, C;

A = 11;
B = 0;

C= A / B;

Bentuk kode di atas menunjukkan sebuah proses pembagian dengan angka nol, yang tentu saja tidak diizinkan untuk digunakan oleh sebuah bilangan bulat. Mungkin, Anda mengira mengapa saya bilang "tidak diizinkan", padahal memang di dalam matematika setiap angka yang dibagi dengan angka 0 akan menghasilkan bilangan infinity atau tak keberhinggaan (∞). Untuk lebih memahaminya, coba perhatikan kode yang lebih sempurna di bawah ini:

//Program02.cs
using System;

class BagiDgnNol
{
    static void Main()
    {
        int A, B, C;

        A=11;
        B=0;

        Console.WriteLine(A);
        Console.WriteLine(B);

        C=A/B;

        Console.WriteLine(C);
    }
}

Program di atas akan dikompilasi dengan benar, tanpa ada kesalahan apapun. Dan ketika dijalankan pun, kita akan melihat nilai dari variabel A dan B karena memang kita telah menyuruh komputer untuk menampilkan nilai dari variabel A dan B. Lalu, program yang kita buat tersebut akan berhenti sejenak, lalu muncul sebuah kotak dialog dengan judul Just-In-Time Debugging. Tekan saja tombol "No" karena kita tidak mau melakukan debugging (lebih tepatnya, belum bisa melakukannya). Kotak dialog pun hilang, tapi di layar console, kita akan melihat pesan:

Unhandled Exception: System.DivideByZeroException: Attempted to divide by zero.

Kita mungkin akan memperoleh informasi mengenai pada baris ke berapa kesalahan tersebut terjadi di dalam berkas kode sumber Program02.cs yang menyebabkan program kita tidak berjalan dengan sempurna. Akhirnya, program pun terhenti dan kita tidak tahu berapa nilai C, karena memang tidak diberi kesempatan untuk memanggil statemen Console.WriteLine yang ketiga yang digunakan untuk memperlihatkan nilai variabel C.

Ketika kita salah dalam mengetikkan kode (sebaiknya sih jangan), mungkin kita akan "akrab" dengan pesan kesalahan yang ditampilkan oleh kompiler (compiler error), yang pada umumnya berisi kesalahan sintaksis di dalam kode yang harus kita perhatikan pada saat melakukan kompilasi (syntax error). Akan tetapi, dalam program Program02.cs di atas, meski tidak ada kesalahan saat melakukan kompilasi, program tidak mau berjalan dengan sempurna, saat dijalankan. Karenanya jenis kesalahan tersebut dikenal juga dengan sebutan runtime error (kesalahan saat dijalankan), karena memang kesalahan tersebut muncul saat program dijalankan, bukan ketika kompilasi, atau bahkan pengetikan.

Saat berhadapan dengan penyebut yang memiliki nilai 0, maka operasi pembagian dikatakan sedang mencoba untuk membuat pengecualian, atau exception, yang merupakan istilah yang digunakan untuk merujuk kepada keluhan yang dimiliki komputer akibat munculnya sebuah masalah. Sebuah program juga sebenarnya dapat diberi informasi mengenai sebuah exception telah terjadi dan disuruh untuk menanganinya, yang nanti akan kita pelajari pada bab selanjutnya. Hingga saat kita belajar hal tersebut, kita mungkin menjadi akrab dengan pesan "unhandled exception", yang berarti sebuah exception yang tidak bisa ditangani oleh program, malahan ditangani oleh .NET Framework. Pesan tersebut juga mengandung kata System.DivideByZeroException, yang merupakan sebuah kelas di dalam namespace System yang digunakan oleh operator pembagian untuk membuat exception.

Dalam program Program02.cs, coba ubah nilai C dengan bentuk seperti di bawah ini:

C = A / 0;

atau

C = 3 / 0;

Sekarang, lakukan kompilasi terhadapnya! Anda akan melihat bahwa saat kompilasi, kompiler akan menampilkan kesalahan

Divide by constant zero 

Saat kita menaruh angka 0 di sebelah kanan tanda pembagian di dalam program kita, kompiler cukup cerdas untuk menolak kode kita dengan mengeluarkan pesan semacam itu. Teks superscript==Ekspresi, Operator, Operand dan Prioritasnya== Oke, sejauh ini, kita hanya menggunakan statemen-statemen yang di dalamnya hanya terdapat satu buah operator aritmetika saja. Sebenarnya, kita juga bisa membuat statemen yang di dalamnya terdapat banyak operator aritmetika yang berbeda-beda. Adalah sangat berguna untuk membuatnya ke dalam sebuah baris dibandingkan dengan membuatnya ke dalam beberapa baris yang justru nanti membuat program kita menjadi lebih panjang. Hanya saja, memang kita harus memiliki pengetahuan terlebih dahulu bagaimana caranya membangun ekspresi yang terdiri atas lebih dari satu operator tersebut. Di dalam The C# Language Specification bagian 7.2, Microsoft mengatakan kaidah "An expression is constructed from operands and operators" (sebuah ekspresi dibangun dari beberapa operand dan beberapa operator).

Berikut adalah contoh ekspresi sederhana yang memiliki dua buah operand, dan sebuah operator binary:

operand1 + operand2

Satu atau kedua operand tersebut dapat menjadi ekspresi aritmetika yang melibatkan operand lainnya. Hasil dari ekspresi di atas adalah hasil penjumlahan dari dua buah operand tersebut di atas.

Berikut ini adalah ekspresi lainnya yang mengandung dua buah operand dan satu buah operator:

operand1 = operand2

Operator sama dengan (=) akan menyebabkan operand yang berada di sebelah kiri (yang harus berupa variabel) akan diatur nilainya agar sama dengan operand yang berada di sebelah kanan. Selain untuk mengubah operand1, ekspresi penugasan juga akan memiliki sebuah nilai tertentu. Nilai dari ekspresi penugasan adalah hasil akhir dari operand di sebelah kiri dari tanda sama dengan, dalam kasus ini adalah operand1.

Berikut ini adalah beberapa contoh statemen penugasan, dan yang terakhir ternyata menggunakan empat buah operator aritmetika yang berbeda-beda:

A = 2;
B = 3;
C = 4;
D = 5;
E = 6;
F = A + B * C / D - E;

Pada statemen terakhir yang berisi penugasan terhadap variabel F, operasi manakah yang akan pertama kali berjalan? Mungkin, kita akan beranggapan bahwa semuanya akan dijalankan secara berurutan, sesuai dengan urutannya, karena memang komputer hanya bisa melakukan eksekusi secara berurutan. Akan tetapi, sebenarnya kompiler C# tidaklah begitu! Bahasa C# memiliki tabel kaidah prioritas operator, yang dalam C# Language Specification disebut sebagai "Operator Precedence and Associativity," sehingga komputer pun akan diberi tahu oleh kompiler C# urutan evaluasi eksekusi dari operator-operator di dalam sebuah ekspresi dengan banyak operator.

Tabel di bawah ini (terkesan mengerikan lho) disusun dengan skala prioritas yang disusun berdasarkan kategorinya, di mana kategori operator yang diletakkan paling atas memiliki prioritas yang paling tinggi, sementara kategori operator yang diletakkan paling bawah memiliki prioritas paling rendah. Akan tetapi, operand-operand yang berada di dalam kategori prioritas yang sama memiliki prioritas yang sama. Untuk operand-operand yang memiliki prioritas yang sama, C# akan melakukan evaluasi terhadap ekspresi tersebut secara berurutan, yakni dari kiri ke kanan.

<thead> </thead>

Prioritas

Kategori

Jenis-jenis operator

tertinggi

Operator utama (primary operator)

(x)
x.y
f(x)
a[x]
x++
x--
new
typeof
sizeof
checked
unchecked

 

Operator unary (unary operator), yang hanya memiliki satu buah operand

+
-
 !
~
++x
--x
(type)x

 

Operator pengalian (multiplicative operator), yang merupakan operator binary, karena memiliki dua operand.

*
/
 %

 

Operator penambahan (additive operator), yang merupakan operator binary.

+
-

 

Operator pergeseran (Shift operator)

<<
>>

 

Operator relasional (Relational operator)

<
>
<=
>=
is

 

Operator persamaan dan pertidaksamaan (equality/inequality operator)

==
 !=

 

Operator logika AND (Logical AND operator)

&

 

Operator logika XOR (Logical XOR operator)

^

 

Operator logika OR (Logical OR operator)

|

 

Operator kondisional AND (Conditional AND operator)

&&

 

Operator kondisional OR (Conditional OR)

||

 

Operator kondisional (Conditional operator)

?:

terendah

Operator penugasan (Assignment operator)

=
*=
/=
 %=
+=
-=
<<=
>>=
&=
^=
|=

Oke, kita kembali lagi ke ekspresi berikut:

F = A + B * C / D  E;

Dilihat dari tabel di atas, terlihat bahwa operator perkalian dan pembagian, termasuk ke dalam kategori multiplicative operator (operator pengalian), dan kategori tersebut lebih tinggi prioritasnya dibandingkan dengan additive operator (operator penambahan). Karena itulah, perkalian dan pembagian akan dilakukan pada urutan pertama kali, dari kiri ke kanan. Operasi yang akan dievaluasi pertama kali dalam ekspresi di atas adalah perkalian, sehingga ekspresi di atas akan menjadi seperti di bawah ini:

F = A + 12 / D - E

Selanjutnya, yang akan dijalankan adalah pembagian:

F = A + 2 - E

Penjumlahan dan pengurangan termasuk ke dalam kategori yang sama, sehingga kedua operasi tersebut akan dilakukan dari kiri ke kanan, sehingga menjadi seperti di bawah ini:

F = 4 - E

Dan kemudian C# akan menjalankan pengurangan, sehingga menjadi:

F = -2

Ternyata, nilai akhir dari variabel F adalah -2.

Akan tetapi, jika kita menghendaki hasil yang berbeda dengan yang di atas, maka gunakanlah tanda kurung buka dan kurung tutup, yang merupakan operator utama tertinggi:

F = (A + B) * C / (D - E);

Jika perlu, gunakan tanda kurung bertumpuk:

F = (A + B) * (C / (D - E));

Perhatikan tabel di atas! Pada kategori operator unary, operator plus (+) dan minus (-) berbeda dengan operator plus (+) dan minus (-) dalam kategori operator penambahan. Prioritas kategori operator unary pun lebih tinggi dibandingkan dengan operator penambahan, bahkan jika dibandingkan dengan operator pengalian sekalipun.

Akan tetapi, tanda sama dengan, yang kita kenal sebelumnya sebagai operator penugasan, terletak pada kategori paling bawah di dalam tabel. Operator penugasan merupakan satu-satunya operator yang memiliki hubungan dari kanan ke kiri, yang berarti beberapa operator penugasan di dalam sebuah baris ekspresi akan diproses dari paling kanan. Perhatikan contoh di bawah ini (contoh ini benar lho!):

A = B = C = 27;

Karena operasi penugasan memiliki asosiasi dari kanan ke kiri, maka variabel C merupakan variabel yang pertama kali diberi nilai 27, lalu variabel B diberi nilai variabel B, dan variabel A sebagai variabel terakhir yang diberi nilai variabel B.

Perhatikan juga contoh di bawah ini:

C = (A = 5) + (B = 6);

Tanda kurung pertama akan memaksa nilai A agar memiliki nilai 5, dan juga nilai ekspresi penugasannya pun juga 5. Tanda kurung kedua akan memaksa agar nilai B memiliki nilai 6, dan ekspresi penugasannya pun juga 6. Variabel C merupakan jumlah antara kedua ekspresi tersebut, sehingga hasilnya adalah 11. Statemen di atas merupakan contoh statemen C# yang valid, karena memang di sana terdapat tanda kurung, sementara jika tidak ada tanda kurung, maka statemen seperti di bawah ini tidaklah valid:

C = A = 5 + B = 6;

Mengapa bisa begitu? Masalahnya adalah bahwa operator penambahan memiliki prioritas yang lebih tinggi dibandingkan dengan operator penugasan, akan tetapi setelah proses penambahan telah dieksekusi, maka bagian sebelah kiri dari tanda sama dengan ketiga bukanlah sebuah variabel lagi. Contoh statemen ilegal lainnya adalah seperti di bawah ini:

A + 12;

Karena memang ekspresi tersebut tidak melakukan apapun atau tidak menyimpan nilai operasi tersebut ke dalam variabel lainnya. Memang, di dalam bahasa C dan C++ statemen seperti di atas adalah legal, tapi karena banyak programmer yang melakukan kesalahan dalam melakukan pemrograman dengan kedua bahasa tersebut, C# sebagai bahasa modern membuang cara penulisan seperti itu.

Increment Operator dan Decrement Operator[sunting]

Para programmer yang menemukan bahasa C pada tahun 1969 mungkin tampaknya tidak menyukai proses pengetikan yang banyak. Atau mungkin mereka sadar akan harga memori dan media penyimpanan waktu itu sangatlah mahal. Apapun alasannya, para desainer bahasa C telah menemukan beberapa “jalan pintas” yang kemudian menjadi fitur unggulan bahasa C, bahkan bisa dianggap sebagai fitur paling populer. Bahasa C# tentu saja mengikuti popularitas tersebut untuk mendapatkan popularitas yang lebih dari para programmer dalam bahasa C. Kita tidak harus menggunakan jalan pintas tersebut, tapi memang hal tersebut seringnya dapat mengurangi pengetikan yang kita lakukan, dan juga untuk membuat program kita terlihat lebih pendek, lebih jelas, atau lebih mudah untuk dipahami.

Fitur yang dimaksud adalah untuk menambahkan sebuah nilai ke dalam sebuah variabel yang telah ada. Sebagai contoh:

BukuYangHilang = BukuYangHilang + BukuYangHilangHariIni;

Kita tidak perlu mengetik variabel yang sama dua kali, jika memang kita hanya menambahkan sesuatu kepada variabel tersebut. Bahasa C# mengizinkan kita untuk menyingkat penulisan statemen di atas menjadi seperti di bawah ini:

BukuYangHilang += BukuYangHilangHariIni;

Perhatikan tanda plus di samping tanda sama dengan. Jika kita menyebutnya “plus sama dengan” atau "plus equal", maka para programmer bahasa pemrograman keluarga C (C, C++, Java, atau C#) akan mengetahui apa yang kita maksudkan. Tanda plus sama dengan secara formal di dalam C# Language Specification disebut sebagai "compound assignment operator." Selain penjumlahan, kita juga bisa menggunakan perkalian, pengurangan, pembagian, atau pembagian sisa. Kita bisa menulis:

BukuYangHilang -= BukuYangDitemukanHariIni;

Berarti nilai yang berada di sebelah kanan akan dikurangkan dari variabel yang berada di sebelah kiri.

Kita juga bisa menggunakan operator perkalian dengan menggunakan metode yang sama:

Budget /= 2;

Berarti variabel Budget akan bernilai setengah nilai variabel Budget sebelumnya, sementara:

Gaji *= 2;

Berarti nilai variabel Gaji akan bernilai 2 kali lebih besar dibandingkan dengan nilai variabel Gaji sebelumnya.

Operator pembagian sisa juga valid di dalam statemen penugasan gabungan:

JumlahSisaKue %= OrangKelaparan;

Sebagai contoh, jika JumlahSisaKue adalah 11 dan OrangKelaparan sama dengan 3, dan masing-masing dari mereka memiliki jumlah kue yang sama, maka nilai JumlahSisaKue akan memiliki nilai 2.

Kita juga bisa menggunakan beberapa penugasan gabungan di dalam ekspresi yang besar, seperti di bawah ini

C = (A += 4) / (B *= 7);

Kalau kita perhatikan contoh-contoh di atas, mungkin kita akan beranggapan bahwa hanya variabel sajalah yang bisa digunakan di dalam beberapa penugasan gabungan. Tapi, sebenarnya, kita bisa lho menggunakannya langsung dengan angka 1, sehingga nilai sebuah variabel bertambah 1 atau berkurang 1. Sebagai contoh, saat melakukan pemilihan umum, perangkat lunak yang digunakan sebagai penghitung suaranya akan merespons dengan instruksi seperti ini:

PemilihSBYJK=PemilihSBYJK+1;

Apa yang terjadi saat ekspresi di atas dieksekusi? Variabel PemilihSBYJK akan bertambah 1, bukan? Seperti halnya kita ketahui kita dapat meringkas bentuk ekspresi di atas menjadi bentuk seperti:

PemilihSBYJK+=1;

Atau kita juga bisa menggunakan satu buah plus tambahan, sehingga menjadi seperti di bawah ini:

PemilihSBYJK++;

Nah, operator ++ disebut sebagai operator penaikan (increment operator). Operator tersebut merupakan operator unary yang memiliki prioritas yang sangatlah tinggi. Tanda plus-plus tersebut juga bisa diletakkan sebelum sebuah variabel, atau bahkan setelah variabel.

++PemilihSBYJK;

Kita juga menggunakan operator -- sebagai operator penurunan (decrement operator) yang dapat digunakan untuk mengurangi nilai dari sebuah variabel:

PemilihSBYJK--;

atau operator itu bisa kita letakkan sebelum variabel:

--PemilihSBYJK;

Dalam beberapa statemen yang ditulis di atas sejauh ini, kita lihat tidak ada perbedaan antara operator penaikan dan operator penurunan yang diletakkan sebelum variabel atau sesudahnya. Akan tetapi, sebenarnya di sana ada sebuah perbedaan yang signifikan, apalagi kalau kita menggunakannya di dalam ekspresi yang lebih besar. Sebagai contoh, anggap saya memiliki sebuah variabel A yang memiliki nilai A, dan kita menulis program dengan di dalamnya terdapat statemen berikut:

B = A++;

Apa yang akan terjadi? Statemen di atas akan menjadikan nilai B sama dengan nilai A, yakni 0, lalu menaikkan nilainya. Setelah statemen di atas dieksekusi, maka nilai B adalah 0, sementara nilai A adalah 1. Akan tetapi bandingkan dengan bentuk seperti ini:

B = ++A;

Apa yang akan terjadi? Statemen di atas akan menaikkan nilai variabel A lalu memberikan nilainya kepada variabel B. Setelah statemen tersebut dieksekusi, kedua variabel A dan B bernilai sama, yakni 1. Perhatikan perbedaannya: saat kita menggunakan A++ berarti, nilai A akan dinaikkan setelah nilainya digunakan di dalam ekspresi, sementara ++A berarti nilai A dinaikkan sebelum nilainya digunakan di dalam ekspresi.