Sebelum melangkah ke kode, kita perlu memahami apa sebenarnya bahasa C itu dan mengapa bahasa ini masih dipakai setengah abad setelah diciptakan. C adalah bahasa pemrograman tingkat rendah yang relatif tipis: sedikit keyword, sedikit abstraksi, dan kontrol penuh terhadap memori. Pada Chapter ini kita akan melihat bentuk paling dasar kode C, ciri khas tipe datanya, serta bagaimana sebuah fungsi didefinisikan dan dipanggil. Tujuannya bukan menghafal sintaks, melainkan membangun intuisi mengapa C menjadi bahasa yang dipilih untuk menulis sistem operasi, compiler, hingga perangkat keras.

Apa Itu Bahasa C #

C adalah bahasa pemrograman compiled dan statically typed yang diciptakan oleh Dennis Ritchie di Bell Labs sekitar tahun 1972. Kata compiled berarti kode sumber C harus diterjemahkan terlebih dahulu oleh compiler menjadi executable sebelum bisa dijalankan oleh prosesor. Kata statically typed berarti setiap variabel wajib memiliki tipe data yang sudah ditentukan pada saat kode ditulis, dan tipe tersebut tidak bisa berubah saat program berjalan.

Karateristik utama C yang membedakannya dari bahasa tingkat tinggi seperti Python atau JavaScript adalah:

  • Tipe data eksplisit: variabel harus dideklarasikan dengan tipe seperti int, char, atau double.
  • Manajemen memori manual: programmer bertanggung jawab mengalokasikan dan membebaskan memori sendiri.
  • Tanpa garbage collector: tidak ada mekanisme otomatis yang membersihkan memori yang sudah tidak terpakai.
  • Pointer sebagai warga kelas satu: alamat memori dapat dimanipulasi langsung lewat pointer.
  • Standar library kecil: hanya menyediakan fungsi-fungsi dasar, sisanya disediakan pustaka pihak ketiga.

Mari kita lihat wujud program C yang paling sederhana:

c
#include <stdio.h>

int main(void) {
    printf("Halo dari bahasa C!\n");
    printf("Bahasa ini lahir di Bell Labs pada awal 1970-an.\n");
    return 0;
}

Output yang Dihasilkan:

text
Halo dari bahasa C!
Bahasa ini lahir di Bell Labs pada awal 1970-an.

Mari kita telaah baris-baris kode di atas:

  1. Baris 1 (#include <stdio.h>): direktif preprocessor yang menyertakan header Standard Input/Output agar fungsi printf dapat dipakai.
  2. Baris 3 (int main(void)): titik masuk program. Kata kunci void di parameter menandakan fungsi main tidak menerima argumen.
  3. Baris 4 (printf("Halo dari bahasa C!\n");): memanggil fungsi printf untuk mencetak teks ke standard output; \n adalah karakter newline.
  4. Baris 5 (printf("Bahasa ini lahir...");): baris kedua yang dicetak setelah baris pertama.
  5. Baris 6 (return 0;): mengembalikan 0 ke sistem operasi sebagai penanda program berakhir dengan sukses.

Tipe Data dan Ukurannya #

Berbeda dengan Python yang menyesuaikan tipe otomatis, C menuntut kita menyebut tipe variabel secara eksplisit. Tipe menentukan berapa banyak byte yang dialokasikan di memori dan operasi apa yang valid. Ukuran tiap tipe bergantung pada compiler dan arsitektur prosesor, sehingga C menyediakan operator sizeof untuk memeriksa ukuran secara aktual saat kompilasi.

c
#include <stdio.h>
#include <limits.h>

int main(void) {
    int nilai = 42;
    long besar = 9223372036854775807L;

    printf("nilai = %d\n", nilai);
    printf("besar = %ld\n", besar);
    printf("Ukuran int  = %zu byte\n", sizeof(int));
    printf("Ukuran long = %zu byte\n", sizeof(long));
    printf("INT_MAX     = %d\n", INT_MAX);
    return 0;
}

Output yang Dihasilkan:

text
nilai = 42
besar = 9223372036854775807
Ukuran int  = 4 byte
Ukuran long = 8 byte
INT_MAX     = 2147483647

Mari kita telaah baris-baris kode di atas:

  1. Baris 2 (#include <limits.h>): menyertakan header yang mendefinisikan konstanta batas tipe, misalnya INT_MAX.
  2. Baris 5 (int nilai = 42;): variabel bertipe int bernama nilai diisi dengan angka 42.
  3. Baris 6 (long besar = ...;): variabel bertipe long menampung bilangan yang jauh lebih besar dari batas int; akhiran L menandakan literal bertipe long.
  4. Baris 8 (printf("nilai = %d\n", nilai);): format specifier %d mencetak int dalam bentuk desimal bertanda.
  5. Baris 10 (sizeof(int)): operator sizeof menghasilkan jumlah byte tipe int bertipe size_t, yang dicetak memakai format specifier %zu.
  6. Baris 12 (INT_MAX): konstanta dari header limits.h yang menyatakan nilai int positif terbesar yang bisa ditampung.

Fungsi sebagai Unit Kerja #

Program C dibangun dari kumpulan fungsi. Setiap fungsi memiliki tipe kembalian, nama, daftar parameter (boleh kosong), dan tubuh fungsi yang dibungkus kurung kurawal. Fungsi main adalah fungsi khusus yang dipanggil sistem operasi saat program dijalankan, sementara fungsi lain harus dipanggil secara eksplisit dari dalam kode.

c
#include <stdio.h>

/* Fungsi sederhana: menjumlahkan dua bilangan */
int tambah(int a, int b) {
    return a + b;
}

int main(void) {
    int hasil = tambah(7, 35);
    printf("7 + 35 = %d\n", hasil);
    return 0;
}

Output yang Dihasilkan:

text
7 + 35 = 42

Mari kita telaah baris-baris kode di atas:

  1. Baris 4 (int tambah(int a, int b)): deklarasi fungsi bernama tambah yang menerima dua parameter int dan mengembalikan int.
  2. Baris 5 (return a + b;): menjumlahkan kedua parameter lalu mengembalikan hasilnya ke pemanggil.
  3. Baris 9 (int hasil = tambah(7, 35);): memanggil tambah dengan argumen 7 dan 35, lalu menyimpan hasil 42 ke variabel hasil.
  4. Baris 10 (printf(...)): mencetak hasil dengan format specifier %d.

Mengapa C Masih Relevan #

Banyak bahasa baru bermunculan, tetapi C tetap dipakai pada lapisan yang membutuhkan kinerja tinggi dan kontrol langsung terhadap perangkat keras. Kernel Linux ditulis dalam C; sebagian besar runtime Python, Ruby, dan PHP juga ditulis dalam C; library glibc, SQLite, dan curl semuanya dalam C. Mempelajari C memberi pemahaman tentang bagaimana memori, pointer, dan system call bekerja di balik bahasa-bahasa tingkat tinggi yang biasa kita pakai.