Değişken, programınızın okuyup değiştirebileceği bir değeri tutan, adlandırılmış bir bellek parçasıdır. C'de ne tür bir değer tuttuğunu en baştan söylersiniz ve o seçim değişkenin ömrü boyunca kalıcıdır.
Bir Değişken Bildirmek
Biçim tip, ad, noktalı virgüldür:
int age;
double price;
char grade;
Her satır o veri tipi için yeterli belleği ayırır ve ona bir ad bağlar. Henüz hiçbir şey saklanmadı - alan vardır, ama içeriği daha önce ne çalıştıysa onun oraya bıraktığı şeydir.
Aynı anda bir değer verebilirsiniz; buna ilk değer verme denir:
Biçim belirteçlerine dikkat edin: int için %d, double için %f, char için %c. printf kendisine verilen değerleri incelemez - biçim metninize güvenir, dolayısıyla bir uyumsuzluk hata değil saçmalık yazdırır.
Bildirimden Sonra Atama
Bir değişken var olduğunda onu = ile değiştirirsiniz:
C'de = atamadır, eşitlik değil. score = score + 10, "score'da ne varsa al, 10 ekle, sonucu score'a geri koy" diye okunur. Karşılaştırma operatörü =='dir ve onları karıştırmak o kadar yaygın bir hatadır ki booleanlar sayfasında kendi bölümü vardır.
Kısayol score += 10 aynı şeyi daha az karakterle yapar; bileşik atama operatörleri tüm aritmetiği kapsar.
İlk Değersiz Değişken Tuzağı
Bu, C'deki tek en yaygın acemi hatasıdır ve bir hata üretmez:
Çalıştırın. Doğru cevap olan 15'i görebilirsiniz. Devasa rastgele bir sayı görebilirsiniz. İkinci bir çalıştırmada ya da farklı bir makinede farklı bir şey görebilirsiniz. Bunların hepsi "doğru" davranıştır, çünkü ilk değersiz yerel bir değişkeni okumak tanımsız davranıştır - C standardı ne olacağı konusunda hiçbir gereksinim koymaz.
Pek çok dilin aksine C yerellerinizi sıfırlamaz. Yerel bir değişken yığından bir dilimdir ve yığın, daha önceki fonksiyon çağrılarından kalan artıklarla doludur. Bazen o artıklar tesadüfen sıfır olur ki bu hatayı çok tehlikeli kılan şeydir: çoğu zaman testte çalışır ve üretimde başarısız olur.
Çözüm tek bir karakterdir:
Bunu alışkanlık yapın: her değişkene bildirim noktasında ilk değer verin. Gerçekten henüz makul bir değeriniz yoksa 0 ya da NULL, çöpten iyidir. Ve çoğu durumu yakalayan -Wall ile derleyin:
warning: 'total' is used uninitialized in this function
Küresel ve static değişkenler istisnadır - onlara otomatik olarak sıfır ilk değeri verilir. Buna güvenmek sorunsuzdur, ama yine de = 0 yazmak niyetinizi belgeler.
Aynı Anda Birkaç Tane Bildirmek
Aynı tipteki değişkenler, ilk değerli ya da ilk değersiz olarak bir bildirimi paylaşabilir:
Bu geçerlidir ve x, y, z gibi sıkı ilişkili değerler için yaygındır. Aynı zamanda klasik bir yanlış okumanın yaşadığı yerdir:
int a = 0, b = 0, c = 0; /* üçü de 0 */
int d, e, f = 0; /* yalnızca f 0 - d ve e çöp */
İlk değer satıra değil tek bir isme bağlanır. Değerler anlam olarak farklılaştığında her birine kendi satırını verin - daha iyi okunur ve daha iyi fark alır.
Göstericileri tek satırda bildirmek aynı tuzağı daha keskin biçimde taşır:
int *p, q; /* p, int'e göstericidir; q düz bir int'tir */
*, tipe değil isme bağlanır. Göstericileri satır başına bir tane bildirin.
Adlandırma Kuralları ve Gelenekler
Derleyicinin kuralları:
- Yalnızca harfler, rakamlar ve alt çizgiler.
- Rakamla başlayamaz:
total2sorunsuzdur,2totaldeğildir. - Bir C anahtar kelimesi olamaz:
int,return,for,doubleadlı bir değişken olmaz. - Büyük-küçük harfe duyarlıdır:
count,CountveCOUNTüç ayrı değişkendir. - Alt çizgiyle başlayan ya da çift alt çizgi içeren isimler gerçekleştirime ayrılmıştır. Onları oluşturmayın.
int itemCount; /* geçerli */
int item_count; /* geçerli - alışıldık C tarzı */
int _count; /* geçerli ama ayrılmış - kaçının */
int item-count; /* hata: '-' eksi operatörüdür */
int 3rd_place; /* hata: rakamla başlıyor */
int float; /* hata: anahtar kelime */
C kodunun çoğunun izlediği gelenekler: değişkenler ve fonksiyonlar için snake_case, makro sabitleri için BUYUK_HARF ve değerin tipinin ne olduğunu değil ne anlama geldiğini söyleyen isimler. elapsed_ms, t'yi yener; customer_count, n2'yi yener.
Kapsam minicikken kısa isimler yine sorunsuzdur - döngü sayacı olarak i evrensel olarak anlaşılır ve kimse for (int loop_iteration_index = 0; ...) istemez.
Bir Değişken Nerede Yaşar
Bir değişkeni nerede bildirdiğiniz, onu kimin görebileceğini ve ne kadar süreceğini belirler. Bu kapsamdır ve kısa hâli şudur:
Bir değişken, bildiriminden onu içeren bloğun kapanış parantezine kadar görünürdür. Küreseller tüm program boyunca yaşar ve her yerde görünürdür; bu elverişli gibi gelir ve sorun çıkarmalarının sebebidir: her fonksiyon birini değiştirebilir, dolayısıyla kimin değiştirdiğini bulmak tüm dosyada arama yapmaya dönüşür. Yerelleri tercih edin ve değerleri fonksiyonlara parametre olarak geçirin.
Her Yerde Bildirmek (C99 ve Sonrası)
Özgün C89'da her bildirimin bir bloktaki herhangi bir deyimden önce gelmesi gerekirdi:
int main(void) {
int i, sum = 0; /* önce tüm bildirimler */
printf("Basliyor\n");
for (i = 0; i < 10; i++) { sum += i; }
return 0;
}
C99'dan beri, for başlığı dahil, değere ilk ihtiyaç duyduğunuz yerde bildirebilirsiniz:
Bu daha iyi bir tarzdır: bildirim ilk kullanımının yanında durur ve i fonksiyonun geri kalanına sızamaz. -std=c17 (ya da herhangi bir C99+ ayarı) ile derleyin, her yerde çalışır.
Sıkça Sorulan Sorular
C'de bir değişken nasıl bildirilir?
Tipi, sonra adı, sonra bir noktalı virgül yazın: int age;. Aynı anda ona bir değer verebilirsiniz - int age = 30; - buna ilk değer verme denir ve neredeyse her zaman istediğiniz şeydir.
Bir değişkeni bildirmek ile ilk değer vermek arasındaki fark nedir?
Bildirmek yeri ayırır ve adlandırır (int count;). İlk değer vermek, oluşturulduğu anda içine bir değer koyar (int count = 0;). Bildirilmiş ama ilk değeri verilmemiş yerel bir değişken, o adreste zaten ne bayt varsa onu içerir - onu okumak tanımsız davranıştır.
C'de değişken adları için kurallar nelerdir?
Yalnızca harfler, rakamlar ve alt çizgiler; rakamla başlayamaz; int ya da for gibi bir anahtar kelime olamaz; ve büyük-küçük harfe duyarlıdır, dolayısıyla total ile Total farklı değişkenlerdir. Alt çizgiyle başlayan isimler ayrılmıştır - onlardan kaçının.
Bir C fonksiyonunda değişkenler her yerde bildirilebilir mi?
C99'dan beri evet - her değişkeni ilk ihtiyaç duyduğunuz yerde bildirin. Özgün C89 standardında her bildirimin bir bloğun tepesinde görünmesi gerekirdi; eski kodda herhangi bir gerçek işten önce bir bildirim duvarı olmasının sebebi budur.