Operator aritmetika adalah keluarga operator paling sering kita pakai di C. Setiap kali kita menghitung total belanja, membagi data menjadi potongan-potongan yang sama besar, atau menentukan sisa bagi untuk mengetahui apakah suatu angka genap, kita memakai operator +, -, *, /, dan %. Pada Chapter ini kita akan menelusuri cara kerja kelima operator tersebut, khususnya jebakan yang paling sering menjebak pemula: pembagian integer yang membulatkan ke nol, serta batasan operator modulo yang hanya berlaku untuk operand berupa bilangan bulat. Kita juga akan membahas operator unary + dan - yang dipakai untuk menandai tanda suatu nilai.

Operator Aritmetika Biner #

C menyediakan lima operator aritmetika biner yang bekerja pada dua operand. Setiap operator menghasilkan sebuah nilai baru tanpa mengubah operand asalnya, kecuali operand tersebut dipakai dalam pernyataan assignment terpisah.

OperatorOperasiContohHasil
+Penjumlahan17 + 522
-Pengurangan17 - 512
*Perkalian17 * 585
/Pembagian17 / 53
%Sisa bagi (modulo)17 % 52
c
#include <stdio.h>

int main(void) {
    int a = 17;
    int b = 5;

    printf("a = %d, b = %d\n", a, b);
    printf("a + b = %d\n", a + b);
    printf("a - b = %d\n", a - b);
    printf("a * b = %d\n", a * b);
    printf("a / b = %d\n", a / b);
    printf("a %% b = %d\n", a % b);
    return 0;
}

Output yang Dihasilkan:

text
a = 17, b = 5
a + b = 22
a - b = 12
a * b = 85
a / b = 3
a % b = 2

Mari kita telaah baris-baris kode di atas:

  1. Baris 4 (int a = 17;): variabel a dideklarasikan bertipe int dan diisi nilai 17.
  2. Baris 5 (int b = 5;): variabel b diisi nilai 5.
  3. Baris 9 (printf("a / b = %d\n", a / b);): ekspresi 17 / 5 dievaluasi sebagai pembagian integer; pecahan dibuang sehingga hasilnya 3, bukan 3.4.
  4. Baris 10 (printf("a %% b = %d\n", a % b);): % di dalam string format harus ditulis %% agar tidak ditafsirkan sebagai format specifier; nilai 17 % 5 adalah 2 karena 17 = 3*5 + 2.

Pembagian Integer Membulatkan ke Nol #

Salah satu sumber bug paling sering di C adalah perilaku operator / ketika kedua operand bertipe bilangan bulat. Hasil pembagian dibuang pecahannya, dan arah pembulatan selalu ke nol, bukan ke bawah seperti pada banyak bahasa lain. Hal ini berarti 7 / 2 menghasilkan 3, tetapi -7 / 2 menghasilkan -3 (bukan -4).

Untuk mendapatkan hasil bilangan desimal, minimal salah satu operand harus bertipe floating-point. Konversi otomatis akan diterapkan pada operand bertipe int sehingga seluruh perhitungan berlangsung dalam domain floating-point—mekanisme ini akan kita dalami pada Chapter type conversion.

c
#include <stdio.h>

int main(void) {
    int x = 7;
    int y = 2;
    double p = 7.0;
    double q = 2.0;

    printf("Pembagian integer:  7 / 2  = %d\n", x / y);
    printf("Pembagian riil:     7.0 / 2.0 = %.4f\n", p / q);
    printf("Campuran (int/double): 7 / 2.0 = %.4f\n", x / q);
    printf("Pembulatan ke nol:  -7 / 2 = %d\n", -x / y);
    printf("Pembulatan ke nol:  -7.0 / 2.0 = %.4f\n", -p / q);
    return 0;
}

Output yang Dihasilkan:

text
Pembagian integer:  7 / 2  = 3
Pembagian riil:     7.0 / 2.0 = 3.5000
Campuran (int/double): 7 / 2.0 = 3.5000
Pembulatan ke nol:  -7 / 2 = -3
Pembulatan ke nol:  -7.0 / 2.0 = -3.5000

Pada baris ke-9, -x / y menghasilkan -3 (pembulatan ke arah nol), bukan -4 yang akan muncul pada floor division. Hal ini selaras dengan ISO/IEC 9899 §6.5.5 yang menyatakan bahwa hasil pembagian bilangan bulat dipotong ke arah nol.

Operator Aritmetika Unary #

Selain operator biner, C juga memiliki operator unary + dan - yang ditempatkan di depan operand tunggal. Operator - membalikkan tanda nilai numerik, sedangkan operator + secara teknis tidak mengubah nilai namun sesekali dipakai untuk menegaskan niat agar kode lebih mudah dibaca. Kedua operator ini memiliki precedence lebih tinggi dibanding operator biner, sehingga ekspresi seperti -a * b dievaluasi sebagai (-a) * b.

Studi Kasus: Menghitung Pecahan Uang #

c
#include <stdio.h>

int main(void) {
    int saldo = 100000;
    int harga = 17500;
    int jumlah_beli = 3;

    int total_bayar = harga * jumlah_beli;
    int sisa = saldo - total_bayar;
    int pecahan_50rb = total_bayar / 50000;
    int sisa_pecahan = total_bayar % 50000;

    printf("Saldo awal   : Rp %d\n", saldo);
    printf("Total bayar  : Rp %d (Rp %d x %d)\n", total_bayar, harga, jumlah_beli);
    printf("Sisa saldo   : Rp %d\n", sisa);
    printf("Lembar 50rb  : %d (sisa Rp %d)\n", pecahan_50rb, sisa_pecahan);
    return 0;
}

Output yang Dihasilkan:

text
Saldo awal   : Rp 100000
Total bayar  : Rp 52500 (Rp 17500 x 3)
Sisa saldo   : Rp 47500
Lembar 50rb  : 1 (sisa Rp 2500)

Pada contoh di atas, operator * dipakai untuk menghitung total pembayaran, - untuk mengurangi saldo, / untuk menentukan jumlah lembar pecahan Rp 50.000, dan % untuk menghitung sisa yang tidak cukup untuk satu lembar pecahan tersebut. Kombinasi / dan % inilah yang menjadi pola standar untuk memecah nilai mata uang menjadi pecahan-pecahan yang lebih kecil.

Operator aritmetika akan sering kita pakai dalam hampir setiap program berikutnya. Pada Chapter selanjutnya kita akan bertemu operator relasional yang membandingkan dua nilai dan menghasilkan nilai kebenaran.