if ile Karar Vermek
Programlar sürekli verilere tepki verir: geçti ya da kaldı, stokta ya da tükenmiş, geçerli ya da değil. if ifadesi, C++'ın bir koşula dayanarak hangi kodu çalıştıracağını seçme biçimidir.
Bir if, parantez içinde bir koşul alır ve süslü parantezler içindeki bloğu yalnızca o koşul doğru olduğunda çalıştırır:
score >= 60 koşulu doğrudur, bu yüzden mesaj yazdırılır. Kapanış süslü parantezinden sonraki satır her zaman çalışır — o, if'in dışında yer alır. score değerini 40 yapın; "passed" satırı tamamen atlanır.
Koşul bool türüne dönüştürülür. >, >=, ==, != gibi karşılaştırmalar zaten bir bool üretir, ancak C++ sıfırdan farklı her sayıyı doğru, 0'ı ise yanlış olarak değerlendirir — yani if (count) ifadesi "count sıfır değilse" anlamına gelir. Bu örtük dönüşüm pratiktir ama aşağıda göreceğiniz birkaç klasik hatanın da kaynağıdır.
Bir else Eklemek
else, size "aksi halde" yolunu verir — yalnızca koşul yanlış olduğunda çalışan kod:
İki bloktan tam olarak biri çalışır — asla ikisi birden, asla hiçbiri. else'in kendine ait bir koşulu yoktur; yalnızca if'in yakalamadığı her şeyi yakalar.
else if ile Zincirleme
İkiden fazla olası sonuç olduğunda, koşulları else if ile zincirleyin. C++ bunları yukarıdan aşağıya kontrol eder ve koşulu doğru olan ilk bloğu çalıştırır, ardından geri kalanı atlar:
Sıra önemlidir. 84, önce >= 90'a karşı (yanlış), sonra >= 80'e karşı (doğru) test edildiği için B'de durur ve alt sınırları hiç kontrol etmez. score >= 80 && score < 90 yazmaya da bu yüzden gerek yoktur — ikinci dala ulaşmak, score'un zaten 90'ın altında olduğunu garanti eder. En dar ya da en yüksek öncelikli koşulunuzu başa koyun.
C++'ta elif anahtar sözcüğü olmadığını unutmayın — else if tam anlamıyla, gövdesi başka bir if olan bir else'tir. Süslü parantezler bunun tek bir merdiven gibi okunmasını sağlar yalnızca.
Büyük Bir Tuzak: = ile ==
C ve C++'taki en yaygın if ifadesi hatası, == (karşılaştırma) demek isterken = (atama) yazmaktır:
x = 5, 5 değerini x'e atar ve ifadenin tamamı 5 olarak değerlendirilir; bu da true'ya dönüşür — böylece dal her zaman çalışır ve x'i sessizce ezmiş olursunuz. Bu derlenir; çoğu derleyici yalnızca bir uyarı verir. İki savunma: uyarıları açın (-Wall) ki derleyici işaretlesin ve sabiti başa koymayı düşünün — if (5 == x) — çünkü if (5 = x), derleyicinin hemen yakaladığı ciddi bir hatadır.
Aynı tuzak bool ile de gizlenir: if (ready = true) derlenir ve atama yapar, oysa if (ready == true) (ya da yalnızca if (ready)) karşılaştırma yapar.
Koşulları Birleştirmek ve İç İçe Kullanmak
Koşulları && (ve), || (veya) ve ! (değil) ile birleştirin ya da bir kontrol yalnızca önceki bir kontrol geçtikten sonra anlamlı olduğunda bir if'i başka bir if'in içine yerleştirin:
&& ve || kısa devre yapar: a && b içinde a yanlışsa C++ b'yi hiç değerlendirmez. Bu, hatalı bellek erişimine karşı korunmak için çok önemlidir — if (ptr != nullptr && ptr->ready) güvenlidir çünkü ptr boşsa başvuru çözme atlanır. Mümkün olduğunda derin iç içe kullanım yerine && ile düzleştirmeyi tercih edin; düz bir koşul, süslü parantezlerden oluşan bir piramide göre daha anlaşılır okunur.
Göründüğü anlama gelmeyen karşılaştırma zincirlerine dikkat edin: if (0 < x < 10) bir aralığı test etmez. Önce 0 < x'i bir bool'a (0 veya 1) değerlendirir, sonra bunu 10 ile karşılaştırır — her zaman doğru. Bunun yerine if (0 < x && x < 10) yazın.
Üçlü (Ternary) Operatör
Tek istediğiniz iki değer arasından seçim yapmaksa, üçlü operatör ?: kompakt, tek satırlık bir çözümdür. condition ? a : b ifadesini "koşul doğruysa a, değilse b" diye okuyun:
Üçlü operatör, atayabileceğiniz, geçirebileceğiniz ya da doğrudan yazdırabileceğiniz bir değer üretir — sade bir if'in yapamayacağı bir şey. Onu basit seçimler için saklayın: dallardan biri birden çok ifade veya gerçek mantık gerektiriyorsa, iç içe bir üçlü operatörün hızla bir bulmacaya dönüştüğü yerde tam bir if-else okunabilir kalır. (Bir incelik: her iki dal da ortak bir tür paylaşmalıdır, bu yüzden örneğin bir string ile bir int'i karıştırmayın.)
Başlatıcılı if (C++17)
C++17'den beri, kapsamı yalnızca if/else ile sınırlı olacak şekilde, doğrudan if'in içinde bir değişken tanımlayabilirsiniz. Bu, kısa ömürlü yardımcıların çevredeki koda sızmasını önler:
;'den önceki kısım bir kez çalışır ve sonucu hem koşulda hem de else içinde görünür. Bu, "bir şey hesapla, sonra ona göre dallan" desenleri için harikadır — ayrıca sonucun dönüştürülmesi en başta bir kez gerçekleştiği için, daha sonra yeniden hesaplamaktan ya da yanlışlıkla eski bir değeri tekrar kullanmaktan kaçınırsınız. Bir geçici değer yalnızca dallanma için gerektiğinde buna başvurun.
Bir Tuzak: Sarkık Süslü Parantez Tuzağı
C++, bir dalda tek bir ifade olduğunda süslü parantezleri atlamanıza izin verir, ama bu ince bir hataya davetiye çıkarır — girinti yalan söyler:
if (loggedIn)
cout << "Welcome\n";
cout << "Loading dashboard\n"; // if'in PARÇASI DEĞİL!
Yalnızca ilk satır if tarafından kontrol edilir; girinti aksini ima etse de ikinci satır loggedIn'den bağımsız olarak her zaman çalışır. İlgili bir klasik de başıboş noktalı virgüldür: if (x > 0);, if'i boş bir gövdeyle sonlandırır, böylece onu izleyen blok koşulsuz olarak çalışır. Her zaman süslü parantez kullanın — tek satır için bile — ve bu türden hataların çoğu ortadan kalkar.
Sıradaki: switch
if-else if zincirleri, her dal farklı bir koşulu test ettiğinde mükemmeldir. Ama tek bir değeri birçok sabit olasılığa karşı kontrol ediyorsanız — bir menü seçimi, bir enum, bir durum kodu — uzun bir else if merdiveni tekrarlı ve sırasını yanlış kurması kolay hale gelir. switch ifadesi tam da bunun için tasarlanmıştır ve sıradaki sayfa da budur.
Sıkça Sorulan Sorular
C++ içinde bir if-else ifadesi nasıl yazılır?
if sözcüğünden sonra parantez içine bir koşul, çalıştırılacak kodu süslü parantezler içine ve koşul yanlış olduğunda çalışacak isteğe bağlı bir else bloğu koyun: if (score >= 60) { cout << "Pass"; } else { cout << "Fail"; }. Koşul bool türüne dönüştürülür, yani sıfırdan farklı her sayı doğru, 0 ise yanlış sayılır.
C++ bir if ifadesinde = ile == arasındaki fark nedir?
== iki değeri eşitlik açısından karşılaştırır, tek bir = ise atama yapar. if (x = 5) yazmak 5 değerini x'e atar ve ardından 5'i test eder (her zaman doğru) — klasik bir hata. Yalnızca bir uyarıyla derlenir, bu yüzden uyarıları açın ve sabiti başa yazmayı düşünün: if (5 == x).
C++ içinde üçlü (ternary) operatör nedir?
Üçlü operatör condition ? valueIfTrue : valueIfFalse, bir değer üreten kompakt bir if-else'dir. Örneğin string label = age >= 18 ? "adult" : "minor"; iki değerden birini seçer. Onu basit değer seçimleri için kullanın; her dalda gerçek mantık varsa tam bir if-else'e başvurun.