Program C++ pada dasarnya adalah susunan instruksi kecil yang compiler baca satu per satu. Dua istilah yang menggambarkan unit terkecil itu adalah statement (pernyataan) dan expression (ekspresi). Keduanya sering tertukar dalam percakapan sehari-hari, padahal perbedaannya fundamental: ekspresi menghasilkan nilai, sedangkan pernyataan adalah perintah lengkap yang dijalankan. Memahami perbedaan ini membuat pesan error compiler jauh lebih mudah dibaca, karena banyak pesan galat menyebut salah satunya secara eksplisit. Pada Chapter ini kita membedakan keduanya, mengenal blok { }, dan melihat seberapa bebas compiler memperlakukan spasi serta baris baru.
Pernyataan: Satu Instruksi Lengkap #
Pernyataan (statement) adalah potongan perintah terkecil yang bisa dijalankan, dan mayoritas diakhiri titik koma (;). Baris int harga = 3000;, return 0;, hingga std::cout << "Halo\n"; — semuanya pernyataan. Compiler membaca titik koma sebagai tanda “instruksi ini selesai di sini”; tanpa dia, compiler mencoba menggabungkan baris berikutnya dan memunculkan pesan seperti expected ';'. Ada juga pernyataan yang bukan berisi pekerjaan: pernyataan kosong berupa satu titik koma saja adalah kode legal yang tidak melakukan apa pun. Sekelompok pernyataan bisa pula dibungkus blok { } sehingga diperlakukan seperti satu pernyataan besar — kita bedah di bawah.
Ekspresi: Kode yang Menghasilkan Nilai #
Ekspresi (expression) adalah kombinasi operand dan operator yang saat dievaluasi menghasilkan sebuah nilai, dan setiap ekspresi punya tipe. Semua berikut adalah ekspresi: 42 (nilai 42, tipe int), harga * jumlah (hasil perkalian), total - diskon (hasil pengurangan), hingga std::cout << total yang menghasilkan stream itu sendiri. Ekspresi bisa berdiri sendiri, tetapi lebih sering ia menyusun bagian dari pernyataan. Perhatikan baris int total = harga * jumlah;: bagian harga * jumlah adalah ekspresi yang dievaluasi menjadi 12000, sedangkan baris utuhnya adalah pernyataan deklarasi. Bahkan penugasan pun sebenarnya ekspresi — harga = 3000 menghasilkan nilai 3000, fakta yang terasa aneh sekarang tetapi berguna nanti.
Membandingkan Statement dan Expression #
Aturan praktisnya sederhana: bila potongan kode itu punya nilai, ia ekspresi; bila ia adalah instruksi yang utuh dan diakhiri titik koma, ia pernyataan. Tabel berikut merangkum perbandingannya:
| Aspek | Expression | Statement |
|---|---|---|
| Fungsi | Dievaluasi, menghasilkan nilai | Dijalankan, mengubah keadaan atau alur |
| Penanda akhir | Tidak diakhiri ; | Diakhiri ; |
| Contoh | harga * jumlah, 42, total - diskon | int total = harga * jumlah;, return 0; |
| Memiliki tipe | Ya (int, double, dst.) | Tidak (pernyataan bukan nilai) |
Salah satu bukti bahwa penugasan adalah ekspresi adalah penugasan berantai. Potongan berikut legal dan mengisi dua variabel sekaligus karena y = 7 menghasilkan nilai 7 yang lalu ditugaskan ke x:
int x;
int y;
x = y = 7; // y = 7 dievaluasi dulu, hasilnya (7) ditugaskan ke x
Kita tidak menyarankan gaya ini untuk kode sehari-hari — tujuannya hanya menunjukkan bahwa batas antara keduanya bukan soal bentuk, melainkan soal “punya nilai atau tidak”. Sebaliknya, ekspresi yang berdiri jadi pernyataan juga legal: total - diskon; adalah pernyataan ekspresi yang hasilnya dihitung lalu dibuang, dan compiler dengan -Wall biasanya menandai baris semacam itu sebagai tanda lupa sesuatu.
Blok { } dan Keberlakuan Nama #
Blok (compound statement) adalah kumpulan pernyataan yang dibungkus { } dan diperlakukan sebagai satu kesatuan. Tubuh fungsi main() adalah blok; kumpulan pernyataan yang nanti menyertai if dan loop juga blok. Selain menyatukan instruksi, blok membatasi keberlakuan (scope) nama yang dideklarasikan di dalamnya: variabel yang lahir di dalam blok hanya hidup sampai blok itu ditutup. Mekanisme ini memungkinkan dua blok berbeda memakai nama variabel sama tanpa konflik, dan membantu kita menahan “kotak peralatan” agar tidak bocor keluar. Pembahasan scope yang tuntas datang pada Section Variabel dan Tipe Data; di sini cukup kita saksikan efeknya langsung:
#include <iostream>
int main() {
// Setiap pernyataan diakhiri titik koma
int harga = 3000; // deklarasi + inisialisasi
int jumlah = 4;
int total = harga * jumlah; // harga * jumlah adalah ekspresi
std::cout << "Total belanja: " << total << "\n";
{ // blok baru: batas keberlakuan (scope) nama di dalamnya
int diskon = 500;
std::cout << "Setelah diskon: " << total - diskon << "\n";
} // diskon sudah tidak berlaku mulai dari sini
; // pernyataan kosong (empty statement): legal, tidak melakukan apa-apa
std::cout << "Selesai.\n";
return 0;
}Output yang Dihasilkan:
Total belanja: 12000
Setelah diskon: 11500
Selesai.Yang menarik dari program di atas:
- Baris 5-7: tiga pernyataan deklarasi. Pada baris 7, ekspresi
harga * jumlahdievaluasi lebih dulu menjadi12000sebelum disimpan ketotal. - Baris 9: pernyataan ekspresi yang berisi tiga ekspresi
<<yang dirantai, semuanya menghasilkan stream agar rantingnya berlanjut. - Baris 11-14 (blok):
diskonlahir di dalam blok dan ikut terhitung ditotal - diskon(hasil11500). Begitu blok ditutup,diskontidak berlaku lagi — baris di bawahnya tidak bisa memakainya. - Baris 16: pernyataan kosong; legal, tetapi dalam kode nyata biasanya hanya muncul karena typo.
- Baris 18-19: program menutup dengan
return 0, pernyataan terakhir sebelum blok tubuhmain()berakhir.
Whitespace: Format Bebas, Gaya Tidak #
Compiler memperlakukan spasi, tab, dan baris baru sebagai whitespace yang memisahkan token — bukan sebagai bagian dari makna. Satu pernyataan panjang boleh dipecah ke beberapa baris, dan dua pernyataan pendek boleh ditulis dalam satu baris; keduanya menghasilkan program identik:
// Legal: satu pernyataan dipecah beberapa baris agar mudah dibaca
std::cout
<< "Belanja: "
<< total
<< "\n";
// Legal juga, tetapi tidak disarankan: dua pernyataan dalam satu baris
int a = 1; int b = 2;Kebebasan ini menegaskan bahwa keterbacaan adalah tanggung jawab kita, bukan compiler. Konvensi yang menyehatkan kode: satu pernyataan per baris, indentasi konsisten (empat spasi adalah umum untuk C++), dan blok dibuka agar { mudah dipasangkan dengan penutupnya. Format yang rapi tidak mengubah perilaku program, tetapi sangat mengubah cepat-lambatnya kita menemukan kesalahan — pekerjaan yang jadi rutin begitu kita mulai membaca pesan error, seperti yang kita latih di Chapter penutup section ini.
Sebelum melompat ke pesan error, ada satu perkakas menulis yang selama ini sudah muncul di contoh tanpa kita bahas: komentar. Chapter berikutnya membahas cara menulis catatan di dalam kode yang oleh compiler sengaja diabaikan.