Saat menulis kode C sehari-hari, kita sering perlu mengingat kembali bentuk sintaks untuk berbagai konstruksi—dari deklarasi variabel, struktur kontrol, definisi fungsi, hingga deklarasi struct. Bab ini berfungsi sebagai lembar ringkas satu halaman yang merangkum sintaks C modern (C11/C17) yang paling sering kita pakai. Kita tidak akan membahas teori mendalam di sini—fokusnya adalah pola sintaks yang dapat langsung kita salin dan sesuaikan.
Deklarasi Variabel #
Variabel di C harus dideklarasikan dengan tipe data eksplisit. Kita dapat menggabungkan beberapa variabel bertipe sama dalam satu statement, menginisialisasi saat deklarasi, dan menggunakan const untuk nilai yang tidak boleh diubah.
int a; /* belum diinisialisasi */
int b = 10; /* inisialisasi saat deklarasi */
int c = 20, d = 30; /* beberapa variabel bertipe sama */
const double PI = 3.14159; /* konstanta */
char *nama = "Budi"; /* pointer ke string literal */
static int counter = 0; /* variabel statis (lifetime sepanjang program) */Tipe Data Primitif #
Tabel berikut merangkum tipe data primitif standar C beserta ukuran umumnya pada platform 64-bit (Linux x86_64). Ukuran sebenarnya bergantung pada compiler dan arsitektur—kita sebaiknya menggunakan <stdint.h> jika butuh ukuran pasti.
| Kategori | Tipe | Ukuran umum | Catatan |
|---|---|---|---|
| Karakter | char | 1 byte | Signed/unsigned bergantung compiler |
| Bilangan bulat | short | 2 byte | |
| Bilangan bulat | int | 4 byte | Ukuran “natural” CPU |
| Bilangan bulat | long | 8 byte (LP64) / 4 byte (LLP64) | Berbeda Linux vs Windows |
| Bilangan bulat | long long | 8 byte | C99, minimal 64 bit |
| Floating point | float | 4 byte | IEEE-754 single |
| Floating point | double | 8 byte | IEEE-754 double |
| Void | void | — | Tipe kosong (untuk fungsi/pointer generik) |
Control Flow: Percabangan dan Perulangan #
C menyediakan lima konstruksi control flow utama: if/else, switch, for, while, dan do/while. Kita juga dapat menggunakan break untuk keluar dari loop dan continue untuk melompat ke iterasi berikutnya.
/* if / else if / else */
if (x > 0) {
printf("positif\n");
} else if (x < 0) {
printf("negatif\n");
} else {
printf("nol\n");
}
/* switch dengan break */
switch (kode) {
case 1:
printf("satu\n");
break;
case 2:
printf("dua\n");
break;
default:
printf("lainnya\n");
break;
}
/* for loop dengan iterasi counter */
for (int i = 0; i < 10; i++) {
printf("%d ", i);
}
/* while loop dengan kondisi */
while (x > 0) {
x--;
}
/* do/while loop - minimum sekali jalan */
do {
baca_input();
} while (!valid);Fungsi #
Fungsi di C terdiri dari prototipe (deklarasi), definisi, dan pemanggilan. Prototipe memberitahu compiler tentang signature fungsi sebelum definisi penuh ditemukan—biasanya diletakkan di header file.
/* Prototipe */
static int kuadrat(int x);
/* Definisi */
static int kuadrat(int x) {
return x * x;
}
/* Pemanggilan */
int hasil = kuadrat(5); /* hasil = 25 */Bentuk umum definisi fungsi:
[tipe_kembalian] [nama_fungsi]([parameter1], [parameter2], ...) {
/* badan fungsi */
return [nilai];
}Jika fungsi tidak menerima parameter, gunakan void secara eksplisit (int f(void)), bukan int f()—bentuk kosong ( ) di C berarti “parameter tidak ditentukan” dan dapat menyebabkan bug halus.
Struct, Union, dan Enum #
Struct mengelompokkan beberapa field menjadi satu tipe. Union mirip struct tetapi semua field berbagi memori yang sama—hanya satu field yang aktif pada satu waktu. Enum mendefinisikan konstanta bilangan bulat bernama.
/* Struct dengan typedef */
typedef struct {
int x;
int y;
} Titik;
Titik p = {3, 4}; /* inisialisasi aggregate */
p.x = 10; /* akses field */
/* Union */
typedef union {
int i;
float f;
} Angka;
Angka u;
u.i = 65;
printf("%c\n", (char)u.i); /* mencetak 'A' */
/* Enum */
typedef enum { MERAH, HIJAU, BIRU } Warna;
Warna w = HIJAU; /* w bernilai 1 */Pointer dan Array #
Pointer menyimpan alamat memori. Array adalah blok memori kontigu dengan tipe elemen tertentu. Nama array dapat meluruk menjadi pointer ke elemen pertama dalam banyak konteks.
int a = 42;
int *p = &a; /* p menyimpan alamat a */
printf("%d\n", *p); /* dereference: cetak 42 */
int arr[5] = {10, 20, 30, 40, 50};
int *q = arr; /* arr meluruk menjadi &arr[0] */
printf("%d\n", q[2]); /* cetak 30 */
/* Pointer arithmetic */
q++;
printf("%d\n", *q); /* cetak 20 (arr[1]) */Program Lengkap #
Program berikut menyatukan semua konstruksi dasar—variabel, control flow, fungsi, struct, pointer—menjadi satu contoh yang dapat kita jadikan referensi cepat.
/* File: sintaks1.c - Ringkasan sintaks C */
#include <stdio.h>
#include <stdbool.h>
static int tambah(int a, int b); /* prototipe */
static void cetak_status(bool ok);
typedef struct { char nama[32]; int umur; } Orang;
typedef enum { HARI_KERJA, HARI_LIBUR } JenisHari;
int main(void) {
int nilai = 42;
const char *sapa = "Halo";
int arr[3] = {10, 20, 30};
int *p = arr;
printf("%s\n", sapa);
if (nilai > 50) { printf("Besar\n"); }
else { printf("Kecil\n"); }
for (int i = 0; i < 3; i++) {
printf("arr[%d] = %d\n", i, arr[i]);
}
int n = 3;
while (n > 0) { printf("n = %d\n", n); n--; }
JenisHari hari = HARI_LIBUR;
switch (hari) {
case HARI_KERJA: printf("Bekerja\n"); break;
case HARI_LIBUR: printf("Istirahat\n"); break;
default: printf("Tidak diketahui\n"); break;
}
int hasil = tambah(nilai, 8);
printf("hasil = %d\n", hasil);
Orang budi = {"Budi", 30};
printf("%s berumur %d\n", budi.nama, budi.umur);
printf("*p = %d, p[1] = %d\n", *p, p[1]);
cetak_status(true);
return 0;
}
static int tambah(int a, int b) { return a + b; }
static void cetak_status(bool ok) {
printf("Status: %s\n", ok ? "OK" : "GAGAL");
}Compile dan jalankan:
gcc -std=c11 -Wall -Wextra -o sintaks1 sintaks1.c
./sintaks1Output yang Dihasilkan:
Halo
Kecil
arr[0] = 10
arr[1] = 20
arr[2] = 30
n = 3
n = 2
n = 1
Istirahat
hasil = 50
Budi berumur 30
*p = 10, p[1] = 20
Status: OKMari kita telaah baris-baris kode di atas:
- Baris 4-5 (
static int tambah(...)danstatic void cetak_status(...)): Prototipe fungsi dideklarasikan denganstaticagar hanya terlihat di dalam file ini (linkage internal). Praktik baik untuk fungsi pembantu private. - Baris 7 (
typedef struct { ... } Orang;): Kita menggabungkan deklarasi struct dan typedef dalam satu statement—bentuk yang paling sering dipakai di kode modern. - Baris 17 (
int *p = arr;): Nama arrayarrmeluruk menjadi pointer ke elemen pertama. Assignment ini menyebabkanpdanarrmenunjuk ke lokasi memori yang sama. - Baris 24 (
for (int i = 0; i < 3; i++)): Loop counteridideklarasikan di dalamfor—legal sejak C99. Lingkupiterbatas pada blok loop. - Baris 38-39 (
Orang budi = {"Budi", 30};): Inisialisasi aggregate dengan urutan field sesuai deklarasi struct.