switch deyimi hakkında az bilinen gerçekler

Kodlarda çok sık kullandığımız switch deyimine ilişkin tüm kuralları biliyor muyuz? Bu yazıda switch deyimine ilişkin daha az bilinen kuralları ele alacağız. Hadi başlayalım…

switch deyiminin gövdesinin bloklanması zorunlu değildir. if, while, do while, for kontrol deyimlerinde olduğu gibi switch deyiminin de gövdesi bir boş deyim (null statement) olabilir:

Yukarıdaki deyim faydalı bir amaçla kullanılma olasılığı bulunmasa da geçerli bir switch deyimidir.

switch deyiminin gövdesi bir ifade deyimi de (expression statement) olabilir. Aşağıdaki geçerli C programı standart çıkış akımına bir şey yazdırmaz:

Aşağıdaki switch deyimi pratikte bir if deyimine eşdeğerdir:

switch deyiminin gövdesinde bir case etiketi (label) bulunmak zorunda değildir. Programcılarla yapılan iş görüşmelerinde sık sorulan soruyu muhtemelen biliyorsunuz:
Sonlandırıcı atom (;) kullanmadan ekrana “merhaba dunya” yazdıran bir C kodu yazınız.
Sevmediğim bu mülakat sorusunun programcıdan beklenen yanıtlarından biri şöyle:

Standart stdio.h başlık dosyasından gelen sonlandırıcı atomlar nedense bu soruda yok sayılır.

switch deyiminin gövdesini oluşturan blok da diğer bloklar gibi bir bilinirlik alanıdır (scope). Bu blok içindeki case‘ler yalnızca birer etiket (label) olarak görev yapar. case etiketlerinden önce de blok içinde yürütülebilir deyimler yazılabilir. Ancak switch deyiminde, programın akışı bir case etiketini izleyen deyime yönlendirileceğinden case etiketleri öncesinde yazılan deyimler geçerli olsa da bu deyimlerin yürütülme olasılığı yoktur:

Ancak case etiketlerinden önce bir bildirim yapılabilir ve bildirilen isim switch bloğu içinde kullanılabilir.

C dilinde bir etiketten sonra bir bildirim yer alamaz. Etiketlerden sonra yürütülebilir bir deyim gelmelidir. Aşağıdaki switch deyimine bakalım:

C dilinde bir case içinde değişken bildirebilmek için aşağıdaki yöntemlerden biri kullanılabilir.
i) Etiketten sonra doğrudan bir bildirim deyimi gelemeyeceğinden bildirim öncesine bir boş deyim koyularak kod geçerli kılınabilir:

i) Etiketten sonra yeni bir blok oluşturulabilir ve değişken bu blok içinde tanımlanabilir:

Yukarıdaki kod hem C dilinde hem C++ dilinde geçerlidir. Tabi bu durumda x değişkeni yalnızca tanımlandığı blok içinde kullanılabilir.
C++ dilinde ise etiketlerden sonra bildirimlerin yer alması geçerlidir. Aşağıdaki kodun C++ dilinin kurallarına göre derlendiğini düşünelim:

Yukarıdaki kodda

etiketinden sonra x değişkeninin tanımlanması C dilinde geçersiz C++ dilinde geçerlidir. Ancak bu switch deyiminde akışın daha sonraki bir case etiketini izleyen bir deyime yönlendirilmesi durumunda, bu değişken kullanılırsa çöp değeri (garbage value) ile kullanılmış olur.
Ancak bir etiketten sonra tanımlanan bir değişkene ilk değer verilmesi C++ dilinde de geçersizdir. C++ dilinde programın akışının ilk değer verilmiş bir değişkenin tanımından sonraki bir noktaya yönlendirilmesine (jump) olanak veren kodlar geçersizdir:

default case son case olmak zorunda değildir. O da diğer case etiketleri gibi herhangi bir yerde olabilir. Derleyici switch parantezi içindeki ifadenin değerinde bir case ifadesinin bulunmaması durumunda, default case nerede olursa olsun programın akışını default case‘e yönlendirecek bir kod üretir:

Yukarıdaki geçerli switch deyiminde c değişkeninin değeri ‘e’ ya da ‘h’ değilse programın akışı default case‘e yönlendirilir.

default bir anahtar sözcüktür. Bu anahtar sözcüğün yanlış yazılması sonucunda bir isim (identifier) oluşur ve bu ismi  iki nokta üst üste atomu (:) izlerse bu isim bir etiket olarak ele alınır. Bu durumda kod geçerlidir fakat kodun anlamı değişir. Aşağıdaki kodu derleyip çalıştırın:

Necati Ergin

C ve Sistem Programcıları Derneğinde eğitmen olarak çalışıyor.

Bunlar da ilginizi çekebilir

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Kod Eklemek İçin Okuyun