Bölüm 4 / 15
Koşullar
if/else, switch, ternary.
8 dakikalık okuma
İlk dersin tablosundaki ikinci akış yapısı — seçim —
bu derste gerçek koda dönüşüyor. Geçen ders kurduğun bool ifadeler artık programın
yönünü belirleyecek: if/else ile dallanma, else if zinciriyle
çok yollu seçim, switch ile değer eşleme ve tek satırlık seçim için ternary
operatörü. Ders, yazılı sınavların "bu kod hangi dalı çalıştırır?" sorularının tüm
malzemesini içerir.
01Ne öğreneceksin
if,elseveelse ifzinciri; zincirde sıranın neden sonucu değiştirdiğiswitchdeyimi: case, break, default; ne zaman if yerine tercih edildiği- Ternary operatörü
?:— tek satırlık seçim ve sınırları - Koşul yazarken en sık yapılan üç hata ve C#'ın hangilerini derlemede yakaladığı
02if: koşullu çalışan blok
if, parantez içinde bir bool ifade bekler; ifade true ise
süslü parantezle sınırlanmış blok çalışır, false ise blok atlanır ve akış
bloğun bitiminden devam eder:
int puan = 85;
if (puan >= 70)
{
Console.WriteLine("Sınavı geçtin.");
Console.WriteLine("Sözlüye girmeye hak kazandın.");
}
Console.WriteLine("Değerlendirme bitti."); // her durumda çalışır
Üç yapısal kural: koşul parantez içindedir; koşuldan sonra noktalı virgül konmaz (if bir deyim başlatır, bitirmez); blok süslü parantezle açılır-kapanır. Girinti (blok içini içeri itmek) derleyici için anlamsız, insan için zorunludur — akışın hangi satırları kapsadığını girinti gösterir. Blok tek satır olduğunda süslü parantez teknik olarak atılabilir; bu müfredat her zaman süslü parantez yazar — sonradan satır eklerken doğan sinsi hataları baştan kapatır. Girintiyi elle dert etme: bloklar iç içe geçtikçe kayan hizayı Shift+Alt+F (Hat 0'ın editör dersindeki Format Document) tek hamlede düzeltir; format-on-save açıksa her kayıt zaten hizalar.
03else ve else if: yol ayrımını tamamlamak
else, if koşulu false olduğunda çalışacak bloğu tanımlar — iki yol,
tam ayrım. Üç ve daha fazla yol için araya else if basamakları girer:
int puan = 62;
if (puan >= 85)
{
Console.WriteLine("Pekiyi");
}
else if (puan >= 70)
{
Console.WriteLine("İyi");
}
else if (puan >= 55)
{
Console.WriteLine("Orta");
}
else
{
Console.WriteLine("Başarısız");
}
Zincirin çalışma kuralı kesindir: koşullar yukarıdan aşağı sırayla denenir,
ilk true olan dal çalışır ve zincir orada biter — sonraki koşullara hiç
bakılmaz, en sondaki else "hiçbiri tutmazsa" dalıdır. puan 62 için akış:
85'e takılmaz, 70'e takılmaz, 55'i sağlar → "Orta" yazar, çıkar.
Sıra bu yüzden sonucun parçasıdır. Aynı zinciri puan >= 55 ile
başlatsaydın, 90 alan öğrenci de ilk dala takılır ve "Orta" görürdü — koşullar tek tek
doğru, sıralama yanlış. Aralık kontrollerinde kural: en dar/en yüksek koşuldan en
genişe doğru sırala. Ayrıca zincirin, art arda yazılmış bağımsız if'lerden farklı
olduğunu gör: bağımsız if'lerin hepsi denenir, zincirde ise ilk eşleşmede çıkılır.
04İç içe if ve erken çıkış düşüncesi
Bir bloğun içine yeni bir if koymak serbesttir; buna iç içe (nested) koşul denir:
if (yas >= 18)
{
if (puan >= 70)
{
Console.WriteLine("Başvuru kabul edildi.");
}
else
{
Console.WriteLine("Puan yetersiz.");
}
}
else
{
Console.WriteLine("Yaş şartı sağlanmıyor.");
}
İç içe yapı bazen kaçınılmazdır ama derinleştikçe okunabilirlik hızla düşer. İki
pratik çare: koşulları && ile birleştirmek
(if (yas >= 18 && puan >= 70) — geçen dersin operatörü) ve
"olmayan durumu önce ele, çık" düşüncesi (guard clause — metotlarla birlikte 8. derste
asıl gücüne kavuşur). Şimdilik hedefin şu: üç seviyeden derin if görmeyi bir uyarı
işareti say.
05switch: bir değeri seçeneklerle eşlemek
Zincirdeki her koşul aynı değişkeni farklı değerlerle eşitlik üzerinden
karşılaştırıyorsa, bunun için özel yapı vardır: switch. Değer hangi
case ile eşleşirse o dal çalışır; hiçbiriyle eşleşmezse
default:
Console.Write("Gün numarası (1-7): ");
int gun = int.Parse(Console.ReadLine());
switch (gun)
{
case 1:
Console.WriteLine("Pazartesi");
break;
case 6:
case 7:
Console.WriteLine("Hafta sonu");
break;
default:
Console.WriteLine("Hafta içi");
break;
}
Kurallar: her dolu dal break ile bitmek zorundadır — C#'ta
break'i unutup alttaki case'e "akmak" (fall-through) derleme hatasıdır; bu, C ve
JavaScript'teki ünlü hata sınıfını C#'ın dilden kaldırmasıdır. Boş case'ler ise üst
üste yazılabilir (case 6: case 7:) — "bu değerlerin hepsi aynı dala"
demektir. default zincirdeki else'in karşılığıdır ve
alışkanlık olarak hep yazılır.
Seçim kılavuzu: koşullar aralık ya da karmaşık ifadeyse if/else zinciri; tek bir değişkenin belirli değerleriyle eşleşmeyse switch — daha okunaklı ve niyeti açık. C#'ın modern sürümlerinde switch'in ifade biçimi (switch expression) ve desen eşleme yetenekleri de vardır; onlar Hat 03'ün modern C# dersinde (cs-modern) — önce klasik biçim otursun.
06Ternary: tek satırlık seçim
Sık görülen bir durum: iki değerden birini seçip bir değişkene atamak. if/else ile
dört satır tutan bu iş için üç parçalı ternary operatörü vardır:
koşul ? doğruysaDeğer : yanlışsaDeğer. Ternary bir ifadedir —
değer üretir, bu yüzden atamanın sağına yazılabilir:
// if/else ile:
string sonuc;
if (puan >= 70) { sonuc = "geçti"; }
else { sonuc = "kaldı"; }
// ternary ile — aynı iş:
string sonuc2 = puan >= 70 ? "geçti" : "kaldı";
Console.WriteLine($"Durum: {(puan >= 70 ? "geçti" : "kaldı")}"); // interpolation içinde de olur
Sınırını bil: ternary, kısa ve tek seçim için okunaklıdır. İç içe ternary
(a ? b : c ? d : e) yazmak teknik olarak mümkün, pratikte okunmazdır —
üç ve üzeri yol varsa else if zincirine ya da switch'e dön.
07Üç klasik hata
1 — Karşılaştırma yerine atama: if (x = 5). Geçen dersten
biliyorsun: C# bunu derlemede yakalar (atama int üretir, if bool bekler). Ama
operandlar zaten bool ise yakalayamaz: if (aktifMi = true) derlenir ve
her zaman true olur — doğrusu if (aktifMi); bool değişkeni
== true ile karşılaştırmaya zaten gerek yoktur.
2 — if'ten sonra noktalı virgül:
if (puan >= 70); // ← bu noktalı virgül boş deyimdir
{
Console.WriteLine("Geçti"); // blok if'e bağlı değil: HER ZAMAN çalışır
}
Noktalı virgül if'in gövdesini "hiçbir şey yapma" olarak kapatır; süslü parantezli blok artık bağımsızdır ve koşulsuz çalışır. C# derleyicisi bu kalıba çoğu zaman uyarı verir; uyarıları okumayı alışkanlık et.
3 — Aralığı matematik gibi yazmak: if (0 <= puan <= 100)
derleme hatasıdır; doğrusu iki karşılaştırmayı && ile bağlamaktır
(geçen dersin 6. bölümü). Bu üç hatadan ikisini derleyicinin yakalaması, tip
güvenliğinin günlük getirisidir; yakalayamadığı 1. maddedeki bool varyantı ise "bool'u
== true ile karşılaştırma" alışkanlığıyla kapanır.
08Mini alıştırma — not hesaplayıcı, iki yöntemle
Yaklaşık 20 dakika · dotnet new console -o notlar
- Program kullanıcıdan 0-100 arası bir puan alsın
(
int.Parse(Console.ReadLine())). - Önce girdiyi doğrula: puan 0'dan küçük veya 100'den büyükse "Geçersiz puan" yazıp başka hiçbir şey yapmasın (if/else'in dış katmanı).
- Geçerliyse else if zinciriyle harfe çevir: 85+ → A, 70-84 → B, 55-69 → C, 40-54 → D, altı → F. Zinciri bilerek yanlış sırayla (55'ten başlayarak) yazıp 90 gir — yanlış harfi gör; sonra doğru sıraya çevir.
- Aynı çevirmeyi bir de
switch (puan / 10)ile yaz: case 10 ve 9 birlikte A'ya, case 8 ve 7'nin durumunu kendin hesapla (70-84 sınırına dikkat — switch'in onluk dilimleri 85 sınırını tam karşılayamaz; 8. dilimde iç if gerekecek). Bu pürüz, "aralık işi if'in, değer eşleme işi switch'indir" kılavuzunu kendi elinle doğrulatır. - Son satırda ternary kullan:
Console.WriteLine(puan >= 70 ? "Sözlüye girebilir" : "Sözlüye giremez"); - Sınama seti: 100, 85, 84, 70, 69, 55, 40, 0 ve -5 girip her çıktıyı kontrol et. Sınır değerlerin (85, 70, 55, 40) doğru dala düşmesi bu alıştırmanın asıl testi.
09Kendini sına
else if zincirinde koşulların sırası neden önemlidir? Kural nedir?
Zincir yukarıdan aşağı denenir ve ilk true olan dal çalışıp
zinciri bitirir; sonraki koşullara bakılmaz. Aralık kontrolünde geniş koşul üste
yazılırsa (örneğin puan >= 55 ilk sırada), daha yüksek puanlar da ona
takılır ve yanlış dal çalışır. Kural: koşulları en dar/en yüksekten en genişe doğru
sırala; "hiçbiri" durumu için sona else koy.
C#'ta switch dalında break unutulursa ne olur? Boş case'lerin üst üste yazılması ne anlama gelir?
Dolu bir case'in break (ya da return gibi bir sonlandırıcı)
olmadan bitmesi C#'ta derleme hatasıdır — C ve JavaScript'teki sessiz fall-through
hatası dilden kaldırılmıştır. Boş case'ler ise üst üste yazılabilir
(case 6: case 7: ortak dal) — bu, birden çok değeri aynı dala bağlamanın
meşru yoludur.
Ternary operatörünün üç parçası nedir? string s = x % 2 == 0 ? "çift" : "tek"; ne yapar?
Parçalar: koşul ? doğruysa-değeri :
yanlışsa-değeri. Ternary bir ifadedir, değer üretir; verilen satır x çiftse s'ye
"çift", tekse "tek" atar. Tek ve kısa seçimlerde okunaklıdır; iç içe ternary'den
kaçınılır, çok yollu seçim else if ya da switch'e taşınır.
if (puan >= 70); satırındaki hata nedir ve sonucu ne olur?
Koşuldan sonraki noktalı virgül, if'in gövdesini boş deyim olarak kapatır. Altındaki süslü parantezli blok artık if'e bağlı değildir ve koşul ne olursa olsun çalışır. Program derlenir (çoğu zaman uyarıyla), yani bu bir mantık hatasıdır — derleme hatasından daha sinsi, çünkü program "çalışıyor" görünür.
10Sınav köşesi
Yazılıda nasıl sorulur
İki kalıp hâkim: (1) Çıktı sorusu — bir else if zinciri ya da switch verilir,
belirli girdi için çıktı istenir; çözüm ilk dersteki izleme disiplinidir:
koşulları sırayla dene, ilk true'da dur. Sınır değerler (>= mi
> mü) bilerek kritik seçilir. (2) Hata avı — if (x = 5),
if'ten sonra noktalı virgül, break'siz case gibi parçalar gösterilip "bu kodun
sorunu nedir?" denir. C#'ta hangisinin derleme hatası, hangisinin mantık hatası
olduğunu ayırt etmek tam puanın anahtarıdır.
Sözlüde nasıl anlatılır — 2 dakikalık taslak
"C#'ta koşul yapılarını anlatır mısınız?" için akış: (1) Temel: if bool ifadeye göre bloğu çalıştırır; else tam ayrım verir. (2) Çok yol: else if zinciri — sıranın önemini ve ilk-eşleşen-kazanır kuralını mutlaka söyle. (3) switch — tek değişkenin değer eşlemesi; C#'ta fall-through'un derleme hatası olduğunu belirt, bu ayrıntı dile hâkimiyet gösterir. (4) Ternary — ifade olarak seçim, kısa durumlar için. Kapanış cümlesi: "Aralık kontrolü if'in, değer eşleme switch'in işidir; üç seviye iç içe if görürsem koşulları birleştirmeyi ya da erken çıkışı düşünürüm."
