Variabel adalah sepotong memori bernama yang menyimpan nilai yang bisa dibaca dan diubah oleh programmu. Di C, kamu selalu menyatakan di awal jenis nilai yang disimpannya, dan pilihan itu permanen selama variabel itu hidup.
Mendeklarasikan Variabel
Bentuknya adalah tipe, nama, titik koma:
int age;
double price;
char grade;
Setiap baris memesan memori yang cukup untuk tipe data itu dan memberinya nama. Belum ada yang disimpan: ruangnya sudah ada, tetapi isinya adalah sisa apa pun yang ditinggalkan oleh kode yang berjalan sebelumnya.
Kamu bisa memberi nilai pada saat yang sama, dan itu disebut inisialisasi:
Perhatikan format specifier-nya: %d untuk int, %f untuk double, %c untuk char. printf tidak memeriksa nilai yang diberikan kepadanya. Fungsi ini memercayai format string-mu, jadi ketidakcocokan akan mencetak hasil yang ngawur, bukan error.
Assignment Setelah Deklarasi
Setelah variabel ada, kamu mengubahnya dengan =:
= di C adalah assignment, bukan kesamaan. score = score + 10 dibaca "ambil isi score, tambahkan 10, lalu simpan hasilnya kembali ke score." Operator pembandingnya adalah ==, dan mencampuradukkan keduanya adalah bug yang begitu umum sampai punya bagian sendiri di halaman boolean.
Bentuk singkat score += 10 melakukan hal yang sama dengan karakter yang lebih sedikit; operator compound assignment mencakup semua operasi aritmetika.
Jebakan Variabel yang Belum Diinisialisasi
Inilah bug pemula paling umum di C, dan bug ini tidak menghasilkan error:
Jalankan. Kamu mungkin melihat 15, yang merupakan jawaban yang benar. Kamu mungkin melihat angka acak yang sangat besar. Kamu mungkin melihat hasil lain saat dijalankan kedua kalinya atau di mesin lain. Semuanya adalah perilaku yang "benar", karena membaca variabel lokal yang belum diinisialisasi adalah undefined behavior: standar C sama sekali tidak menentukan apa yang terjadi.
Tidak seperti banyak bahasa lain, C tidak mengisi variabel lokalmu dengan nol. Variabel lokal adalah sepotong stack, dan stack penuh dengan sisa-sisa dari pemanggilan fungsi sebelumnya. Kadang sisa itu kebetulan nol, dan itulah yang membuat bug ini sangat berbahaya: sering berjalan saat diuji, lalu gagal di produksi.
Perbaikannya hanya satu karakter:
Jadikan kebiasaan: inisialisasi setiap variabel saat dideklarasikan. Jika kamu memang belum punya nilai yang masuk akal, 0 atau NULL lebih baik daripada nilai sampah. Dan compile dengan -Wall, yang menangkap sebagian besar kasusnya:
warning: 'total' is used uninitialized in this function
Variabel global dan static adalah pengecualiannya: keduanya otomatis diinisialisasi dengan nol. Mengandalkan hal itu tidak masalah, tetapi tetap menulis = 0 mendokumentasikan maksudmu.
Mendeklarasikan Beberapa Variabel Sekaligus
Variabel dengan tipe yang sama bisa berbagi satu deklarasi, dengan atau tanpa inisialisasi:
Ini sah dan umum untuk nilai-nilai yang erat kaitannya seperti x, y, z. Di sini juga ada salah baca yang klasik:
int a = 0, b = 0, c = 0; /* all three are 0 */
int d, e, f = 0; /* only f is 0 - d and e are garbage */
Inisialisasi menempel pada satu nama, bukan pada barisnya. Jika nilai-nilainya punya arti yang berbeda, beri masing-masing barisnya sendiri: lebih enak dibaca dan lebih rapi saat dibandingkan perubahannya (diff).
Mendeklarasikan pointer dalam satu baris punya jebakan yang sama dalam bentuk yang lebih tajam:
int *p, q; /* p is a pointer to int; q is a plain int */
* menempel pada nama, bukan pada tipe. Deklarasikan pointer satu per baris.
Aturan dan Konvensi Penamaan
Aturan dari compiler:
- Hanya huruf, digit, dan garis bawah.
- Tidak boleh diawali digit:
total2boleh,2totaltidak. - Tidak boleh berupa kata kunci C: tidak ada variabel bernama
int,return,for,double. - Case sensitive:
count,Count, danCOUNTadalah tiga variabel yang berbeda. - Nama yang diawali garis bawah, atau mengandung dua garis bawah berturut-turut, dicadangkan untuk implementasi. Jangan membuatnya.
int itemCount; /* legal */
int item_count; /* legal - the usual C style */
int _count; /* legal but reserved - avoid */
int item-count; /* error: '-' is the minus operator */
int 3rd_place; /* error: starts with a digit */
int float; /* error: keyword */
Konvensi yang diikuti sebagian besar kode C: snake_case untuk variabel dan fungsi, UPPER_CASE untuk konstanta makro, dan nama yang menyatakan arti nilainya, bukan tipenya. elapsed_ms lebih baik daripada t; customer_count lebih baik daripada n2.
Nama pendek tetap tidak masalah jika scope-nya sangat kecil: i sebagai penghitung perulangan dipahami semua orang, dan tidak ada yang mau menulis for (int loop_iteration_index = 0; ...).
Di Mana Variabel Tinggal
Tempat kamu mendeklarasikan variabel menentukan siapa yang bisa melihatnya dan berapa lama variabel itu bertahan. Inilah yang disebut scope, dan versi singkatnya:
Variabel terlihat sejak deklarasinya sampai kurung kurawal penutup dari blok yang memuatnya. Variabel global hidup selama program berjalan dan terlihat di mana saja. Kedengarannya praktis, dan justru karena itulah variabel global menimbulkan masalah: fungsi mana pun bisa mengubahnya, sehingga mencari siapa yang mengubahnya berarti menelusuri seluruh file. Pilih variabel lokal dan kirim nilai ke fungsi sebagai parameter.
Mendeklarasikan di Mana Saja (C99 ke Atas)
Di C89 yang asli, setiap deklarasi harus berada sebelum pernyataan apa pun dalam sebuah blok:
int main(void) {
int i, sum = 0; /* all declarations first */
printf("Starting\n");
for (i = 0; i < 10; i++) { sum += i; }
return 0;
}
Sejak C99, kamu bisa mendeklarasikan variabel di tempat kamu pertama kali membutuhkan nilainya, termasuk di header for:
Ini gaya yang lebih baik: deklarasinya berada di samping pemakaian pertamanya, dan i tidak bisa bocor ke bagian lain dari fungsi. Compile dengan -std=c17 (atau pengaturan C99 ke atas apa pun) dan kode ini berjalan di mana saja.
Pertanyaan yang sering diajukan
Bagaimana cara mendeklarasikan variabel di C?
Tulis tipenya, lalu namanya, lalu titik koma: int age;. Kamu bisa memberinya nilai sekaligus, int age = 30;, yang disebut inisialisasi dan hampir selalu itulah yang kamu inginkan.
Apa perbedaan mendeklarasikan dan menginisialisasi variabel?
Deklarasi memesan ruang dan memberinya nama (int count;). Inisialisasi mengisi ruang itu dengan nilai tepat saat variabelnya dibuat (int count = 0;). Variabel lokal yang dideklarasikan tetapi tidak diinisialisasi berisi byte apa pun yang sudah ada di alamat itu, dan membacanya adalah undefined behavior.
Apa aturan nama variabel di C?
Hanya huruf, digit, dan garis bawah; tidak boleh diawali digit; tidak boleh berupa kata kunci seperti int atau for; dan bersifat case sensitive, jadi total dan Total adalah variabel yang berbeda. Nama yang diawali garis bawah sudah dicadangkan, jadi hindari.
Bisakah variabel dideklarasikan di mana saja dalam fungsi C?
Sejak C99, bisa: deklarasikan setiap variabel tepat di tempat kamu pertama kali membutuhkannya. Di standar C89 yang asli, setiap deklarasi harus berada di awal sebuah blok, dan karena itulah kode lama punya deretan panjang deklarasi sebelum pekerjaan sesungguhnya dimulai.