Skip to content

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, else ve else if zinciri; zincirde sıranın neden sonucu değiştirdiği
  • switch deyimi: 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

  1. Program kullanıcıdan 0-100 arası bir puan alsın (int.Parse(Console.ReadLine())).
  2. Ö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ı).
  3. 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.
  4. 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.
  5. Son satırda ternary kullan: Console.WriteLine(puan >= 70 ? "Sözlüye girebilir" : "Sözlüye giremez");
  6. 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."