Menu

C++ switch Deyimi: case'ler, fall-through ve break

C++ switch deyimi açıklandı: case etiketleri, break ve fall-through, default dalı, case'leri gruplama, enum üzerinde switch ve case içindeki bildirimlerle ilgili tuzaklar.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

switch Ne İşe Yarar

Bir switch, bir değeri sabit seçeneklerden oluşan bir listeyle karşılaştırır ve eşleşen dalı çalıştırır. Kendinizi aynı değişkeni farklı sabitlerle karşılaştırmayı sürdüren uzun bir if/else if zinciri yazarken bulduğunuzda, bir switch bu niyeti daha net biçimde ifade eder ve genellikle daha hızlı bir atlama tablosuna (jump table) derlenir.

Yalnızca tamsayı benzeri bir değer üzerinde, derleme zamanı sabitlerine karşı eşitlik kontrolleri yapar. Aralıkları test edemez, dizgileri karşılaştıramaz veya koşulları birleştiremez. Bunların herhangi biri için if/else ile kalın.

Temel switch

switch'e bir değer verirsiniz, ardından önemsediğiniz değerler için case etiketlerini listelersiniz. Her dal break ile biter:

3 değeri case 3: ile eşleşir, böylece "Wednesday" yazdırılır ve break switch'ten dışarı atlar. default dalı her şeyi yakalayan daldır; hiçbir case eşleşmediğinde çalışır. İsteğe bağlıdır, ama her değerin ele alındığından emin değilseniz onu ekleyin.

case etiketlerinin koşullar değil, iki nokta üst üste ile takip edilen yalın sabitler olduğuna dikkat edin. case 3: yazarsınız, asla case day == 3: değil.

break ve fall-through

Bu, C++'ta switch'in en önemli tuzağıdır. Bir case eşleştikten sonra, yürütme bir sonraki case'de durmaz: bir break'e ya da kapanış parantezine ulaşana kadar düz çalışmaya devam eder. break deyimleri eksik olduğunda neler olduğuna bakın:

Yalnızca "one" bekleyebilirsiniz. Bunun yerine dört satırın hepsi yazdırılır: case 1: ile eşleşmek switch'e oradan girer ve ardından altındaki tüm etiketlerden düşerek geçer. Her dalın ardına bir break; ekleyin, istediğiniz tek satırı elde edersiniz. Bir break'i unutmak, "switch'im neden çok fazla kod çalıştırıyor?" türündeki hataların klasik kaynağıdır.

case'leri Gruplamak İçin Kasıtlı Fall-Through

Fall-through her zaman bir hata değildir: birkaç case'in tek bir gövdeyi paylaşmasını sağlamanın deyimsel yoludur. Case'leri boş bırakın (deyim yok, break yok) ve hepsi bir sonraki bloğa akar:

'A', 'B' ve 'C' aynı "Pass" satırına iner çünkü ilk iki case boştur ve üçüncüye düşerek geçer. Bu temiz ve kasıtlıdır. Biraz kod çalıştırdıktan sonra düşerek geçmeyi gerçekten istediğinizde, bunu bir yorumla belgeleyin; ya da C++17 ve sonrasında, derleyiciye "evet, bunu bilerek yaptım" diyen ve fall-through uyarılarını susturan [[fallthrough]]; özniteliğiyle.

enum üzerinde switch

switch, enum'larla doğal olarak uyum sağlar; çünkü bir enum tam olarak "sabit bir değer kümesinden biri"dir. Derleyiciler ayrıca numaralandırıcılardan birini ele almayı unutursanız sizi uyarabilir:

Kapsamlı bir enum class ile her etiketi nitelemeniz gerekir (Direction::East). Tüm numaralandırıcılar kapsandığı için default'a gerek yoktur ve daha sonra beşinci bir yön eklerseniz ve onun case'ini eklemeyi unutursanız birçok derleyici sizi uyarır. Bu derleyici yardımı, enum'lar için if/else zincirleri yerine switch'i tercih etmenin büyük bir nedenidir.

Bir Tuzak: case İçinde Bildirimler

Bir case içinde başlatıcılı bir değişken bildirip onu kapsam vermeden diğer case'lerde görünür yapamazsınız. Bu yaygın bir derleme hatasıdır:

switch (x) {
    case 1:
        int n = 10;   // hata: case 2'ye atlamak bu başlatmayı atlar
        cout << n;
        break;
    case 2:
        cout << "two";
        break;
}

Derleyici bunu reddeder çünkü case 2: içine düşmek, n hâlâ kapsamdayken n'nin başlatılmasının üzerinden atlardı. Çözüm, case gövdesini kendi parantezleriyle sarmak ve değişkene kendi bloğunu vermektir:

Bir case kendi yerel değişkenine ihtiyaç duyduğunda ona parantez verin. Bu ayrıca değişkenin altındaki case'lere sızmasını da önler.

Sonraki: for döngüsü

switch ve if, programınızın hangi kodu bir kez çalıştıracağını seçmesini sağlar. Ancak işlerin çoğu aynı şeyi defalarca yapmayı gerektirir: saymak, bir liste üzerinde yinelemek, bir koşul değişene kadar tekrarlamak. for döngüsü bunun için iş atıdır ve bir sonraki sayfa odur.

Sıkça Sorulan Sorular

C++'ta if-else yerine switch'i ne zaman kullanmalıyım?

Tamsayı benzeri tek bir değeri, bir menü seçimi, gün numarası ya da bir enum gibi çok sayıda sabit ve değişmez seçenekle karşılaştırırken switch kullanın. Uzun bir if/else if merdiveninden daha okunaklıdır ve derleyicinin dağıtımı optimize etmesine olanak tanır. Koşullarınız aralıklar (x > 10), kayan nokta değerleri, dizgiler veya birden çok değişken içeriyorsa if/else ile devam edin; switch bunların hiçbirini yapamaz.

C++ switch deyiminde break'e neden ihtiyacım var?

Bir case eşleştiğinde, C++ bir break'e ya da switch'in sonuna ulaşana kadar sonraki case'leri çalıştırmaya devam eder. Buna fall-through denir. break bunu durdurur. break'i unutmak klasik bir hatadır: case 1: ile eşleşirsiniz ve yanlışlıkla case 2, case 3 ve default'un kodunu da çalıştırırsınız.

C++'ta hangi tipler üzerinde switch yapılabilir?

Yalnızca tamsayı veya numaralandırma tipleri: int, char, short, long, bool, kapsamlı/kapsamsız enum ve bunlardan birine dönüştürülebilen her şey. double, float veya std::string üzerinde switch yapamazsınız; bunlar için if/else kullanın. Her case etiketi derleme zamanı sabiti olmalıdır.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA