Menu

Variabel C++: deklarasi, inisialisasi, dan scope dijelaskan

Cara kerja variabel di C++: mendeklarasikan dengan tipe, perbedaan penugasan dan inisialisasi, inisialisasi kurung kurawal, aturan penamaan, dan scope yang menentukan di mana variabel hidup dan mati.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Apa itu variabel

Variabel adalah bagian memori yang diberi nama dan menyimpan sebuah nilai. Di C++ setiap variabel punya tipe yang tetap, yang dipilih saat kamu mendeklarasikannya, dan tipe itu tidak pernah berubah. Inilah yang membuat C++ statically typed: compiler tahu tipe setiap variabel sebelum program berjalan, dan menolak mengompilasi kode yang menyimpan jenis nilai yang salah.

Deklarasi punya tiga bagian: tipe, nama, dan (hampir selalu) nilai awal.

Bacalah int age = 30; sebagai "buat sebuah int bernama age dan isi dengan 30". Titik koma mengakhiri pernyataan, sama seperti yang ditunjukkan halaman komentar untuk setiap pernyataan. Perhatikan bahwa isActive dicetak sebagai 1: secara default bool ditampilkan sebagai 1/0, sesuatu yang akan dibahas lebih lanjut di halaman tipe data.

Inisialisasi vs penugasan

Keduanya terlihat mirip tapi merupakan operasi yang berbeda, dan perbedaannya adalah salah satu ide terpenting di halaman ini.

Inisialisasi memberi variabel nilai pertamanya sebagai bagian dari deklarasi. Penugasan (assignment) mengubah nilai variabel yang sudah ada.

Kamu bisa mendeklarasikan tanpa inisialisasi lalu mengisinya nanti, tapi hati-hati:

Itu berhasil karena kita mengisi score sebelum membacanya. Versi yang berbahaya adalah membacanya lebih dulu, yang dibahas berikutnya.

Jebakan variabel yang belum diinisialisasi

Ini jebakan klasik C++ yang tidak ada di banyak bahasa lain. Membaca variabel lokal yang sudah dideklarasikan tapi tidak pernah diberi nilai adalah undefined behavior: variabel itu berisi byte apa pun yang kebetulan ada di memori itu.

int score;             // not initialized
std::cout << score;    // undefined behavior - prints garbage, or "works", or crashes

Compiler akan dengan senang hati membangun kode ini. Ia bisa mencetak 0, bisa mencetak 32766, dan bisa berperilaku berbeda di setiap percobaan atau di setiap mesin, yang membuat bug seperti ini sangat menyiksa untuk dilacak. Ada dua pertahanan:

  • Selalu inisialisasi saat deklarasi. int score = 0; tidak ada biayanya dan menghilangkan seluruh masalah ini.
  • Aktifkan peringatan. Mengompilasi dengan -Wall -Wextra membuat compiler menandai banyak pembacaan variabel yang belum diinisialisasi sebelum sempat merugikanmu.

Pilih cara pertama untuk setiap variabel lokal: beri nilai awal yang masuk akal begitu kamu membuatnya.

Gaya inisialisasi: =, (), dan {}

C++ memberimu beberapa cara untuk menulis nilai awal. Sebagian besar hasilnya sama, tapi inisialisasi kurung kurawal punya satu fitur keamanan tambahan yang perlu kamu tahu.

Alasan memakai {} adalah karena ia menolak konversi narrowing, yaitu penugasan yang diam-diam akan menghilangkan data. Dengan =, nilai pecahan dipotong tanpa suara; dengan {}, compiler menghentikanmu:

int x = 3.9;    // compiles - x silently becomes 3 (the .9 is thrown away)
int y{3.9};     // compile error - narrowing from double to int is not allowed

Menangkapnya saat kompilasi itulah yang kamu inginkan. Kebiasaan modern yang umum adalah memakai {} sebagai default demi pengecekan tambahan itu, dan beralih ke = hanya saat copy initialization lebih enak dibaca.

Aturan dan kebiasaan penamaan

C++ menerapkan beberapa aturan wajib, lalu semua orang menambahkan kebiasaan di atasnya. Aturannya: nama boleh berisi huruf, angka, dan _; tidak boleh diawali angka; tidak boleh berupa kata kunci yang dicadangkan (seperti int atau return); dan membedakan huruf besar-kecil (age dan Age adalah dua variabel yang berbeda). Hindari nama yang diawali garis bawah lalu huruf kapital, atau yang berisi dua garis bawah berturut-turut, karena keduanya dicadangkan untuk implementasi.

Kebiasaan yang diikuti sebagian besar kode C++:

  • Variabel memakai snake_case atau camelCase. Pilih salah satu dan pakai secara konsisten: item_count atau itemCount.
  • Nama sebaiknya menggambarkan nilainya: count, bukan c; user_email, bukan x.

Nama yang jelas bukan hiasan, melainkan cara dirimu di masa depan membaca kode itu. total_price = item_count * price_per_item langsung bisa dipahami, sesuatu yang tidak akan pernah bisa dilakukan t = c * p.

Scope variabel

Sebuah variabel hanya ada di dalam blok, yaitu { ... }, tempat ia dideklarasikan, dan dihancurkan di kurung kurawal penutupnya. Inilah scope-nya. Variabel yang dideklarasikan di dalam loop atau blok if tidak terlihat dari luarnya:

i dan square sama-sama milik loop dan hilang saat loop selesai; total dideklarasikan di blok luar, jadi ia tetap ada. Blok di dalam juga bisa menutupi (shadowing) nama dari blok di luarnya: variabel baru dengan nama yang sama untuk sementara menyembunyikan variabel luar sampai blok dalam ditutup. Ini sering membingungkan, jadi hindari memakai ulang nama di scope yang bersarang.

Kesimpulan praktisnya: deklarasikan setiap variabel di blok terkecil yang membutuhkannya, dan inisialisasi di sana. Scope yang sempit berarti lebih sedikit nama yang bersaing merebut perhatianmu, dan lebih sedikit peluang membaca nilai yang jauh dari tempat nilai itu diisi.

Berikutnya: tipe data

Setiap variabel di halaman ini dimulai dengan sebuah tipe: int, double, string, bool. Halaman berikutnya membahas tipe data C++ secara rinci: tipe-tipe dasar dan ukurannya, integer signed vs unsigned, float vs double, char, dan cara memilih tipe yang tepat untuk setiap kebutuhan.

Pertanyaan yang sering diajukan

Bagaimana cara mendeklarasikan variabel di C++?

Tulis tipenya, lalu namanya, lalu boleh juga diberi nilai: int age = 30;. Tipenya (int) tetap selama variabel itu hidup; namanya (age) adalah cara kamu merujuknya. Kamu bisa mendeklarasikan tanpa nilai, int age;, tapi untuk variabel lokal itu membuatnya berisi nilai sampah sampai kamu mengisinya, jadi selalu inisialisasi saat mendeklarasikan.

Apa perbedaan inisialisasi dan penugasan di C++?

Inisialisasi memberi variabel nilai pertamanya sebagai bagian dari deklarasi: int x = 5; atau int x{5};. Penugasan mengubah nilai variabel yang sudah ada: x = 7;. Perbedaan ini penting karena membaca variabel lokal yang sudah dideklarasikan tapi tidak pernah diinisialisasi adalah undefined behavior.

Apa yang terjadi kalau kamu memakai variabel yang belum diinisialisasi di C++?

Membaca nilai variabel lokal yang belum diinisialisasi adalah undefined behavior: variabel itu berisi byte apa pun yang sudah ada di memori itu, jadi programmu bisa mencetak angka acak, berjalan karena kebetulan, atau crash. Compiler tidak akan menghentikanmu (walaupun banyak yang memberi peringatan dengan -Wall), jadi solusinya adalah selalu memberi variabel lokal nilai saat kamu mendeklarasikannya.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai