Standart C Programlama Dili

2.4. if Deyimi Ve Koşullu İşleç

if deyimi, if anahtar sözcüğünün arkasına parantez içine yazılmış bir ifade ve peşinden gelen bir deyimden oluşur. Tüm bunların arkasında, isteğe bağlı olarak, bir else anahtar sözcüğü ve bir deyim bulunabilir. if’in bu iki şekli aşağıdaki gösterimde özetlenmektedir:

if (ifade)
  deyim

ve

if (ifade)
  deyim
else
  deyim

İşte else’i olmayan bir if deyimi örneği:

if (yas > 65) {
  yasli_kisiler++;
  printf("Yasli bir kisisiniz.\n");
}

Eğer yas 65’ten büyükse, blok içindeki deyimler çalıştırılır, aksi takdirde, kontrol doğrudan bir sonraki deyime geçer. Bu deyimi, her yaştan kişiye hitap edecek şekilde değiştirelim:

if (yas > 65) {
  yasli_kisiler++;
  printf("Yasli bir kisisiniz.\n");
} else
  printf("Henuz yasli bir kisi degilsiniz.\n");

Şimdi, deyiminiz, eğer yas 65’in üstünde ise, az önceki deyimle aynı şekilde davranacaktır, aksi takdirde yeni mesaj görüntülenecektir. Genelde, parantez içine alınmış ifadenin değeri doğru (sıfırdan farklı) ise, ifadeden sonra gelen deyim işletilir; ifadenin değeri yanlış (sıfır) ise, else anahtar sözcüğünden sonra gelen deyim (varsa) işletilir. Örneklerimizde de görüldüğü gibi, bu deyimler bileşik deyimler olabilir, bu da bileşik deyimlerin daha önce belirtiğimiz iyi özelliğidir: Birçok deyimden tek bir deyim oluştururlar. Ayrıca, bileşik deyim başlatan “{” karakterinin ifade ile aynı satırda, onun karşılığı olan “}” karakterinin de anahtar sözcükle aynı sütuna yazıldığına dikkat ediniz. Bu karakterlerin tam yeri—bloğu doğru bir şekilde ayırdıkları sürece—derleyiciyi ilgilendirmez, ancak bu şekilde yazmanın programları anlamayı kolaylaştıracağı inancındayız ve bunu kitap içinde uygulamaya devam edeceğiz.

Şüphesiz, içiçe if deyimleri yazabilirsiniz. Tipik bir örnek şöyle olabilir:

if (yas > 65) {
  yasli_kisiler++;
  printf("Yasli bir kisisiniz.\n");
} else if (yas > 40) {
  orta_yastaki_kisiler++;
  printf("Orta yastasiniz.\n");
} else if (yas > 17) {
  genc_kisiler++;
  printf("Gencsiniz.\n");
} else
  printf("Cocuksunuz.\n");

Bunun tek bir deyim olduğuna dikkat ediniz. Şimdi şunun üzerinde düşünün:

if (yas < 65)
  if (yas > 40) printf("Orta yastasiniz.\n");
else
  printf("Cok yaslisiniz.\n");

Eğer yas 65’ten büyük veya eşitse ne olacaktır? Diğer bir deyişle, else hangi if’e aittir? Mesajlar ve içerlek yazma şekli, bu deyimi yazan kişinin ilk if’e ait olduğunu düşündüğü izlenimini uyandırıyor, fakat bu doğru değil! Kural şöyledir: Her else en yakın else’i olmayan if’e aittir. Bundan dolayı, yukarıda yapılmak istenen işi doğru şekilde yapan if şudur:

if (yas >= 65)
  printf("Cok yaslisiniz.\n");
else if (yas > 40)
  printf("Orta yastasiniz.\n");

veya,

if (yas < 65)
  if (yas > 40)
    printf("Orta yastasiniz.\n");
  else
    ;
else
  printf("Cok yaslisiniz.\n");

veya,

if (yas < 65) {
  if (yas > 40) printf("Orta yastasiniz.\n");
} else
  printf("Cok yaslisiniz.\n");

else’ten sonraki noktalı virgül bir boş deyim oluşturur. Gördüğünüz gibi, sözdizimin bir deyim gerektirdiği, fakat yapılacak bir şey olmadığı yerde boş deyim kullanılabilir. Başka bir yol olarak, ikinci if’i bir blok içine alırsak, boş deyimli else kullanmak zorunda kalmayız.

if (ifade_1)
  değişken = ifade_2;
else
  değişken = ifade_3;

şeklindeki bir if deyimi, koşullu işleç kullanılarak

değişken = ifade_1 ? ifade_2 : ifade_3;

şeklinde basitçe yazılabilir. Genelde, C dilindeki tek üç-işlenenli (üçlü) işleç olan “?:” işleci, önce ifade_1’i hesaplar ve eğer ifade_1 doğru ise ifade_2’nin değerini, aksi takdirde ifade_3’ün değerini verir. Son iki ifadeden sadece biri hesaplanır. Sonucun tipi, önceki bölümde anlatılan dönüşüm kurallarına göre ifade_2 ve ifade_3 birlikte dikkate alınarak belirlenir. “?:” işlecinin sağdan sola doğru birleşme özelliği vardır ve önceliği Kısım 2.2’de görülen tüm işleçlerden düşük, atama işlecinden ise yüksektir.

?:” işlecinin işleri nasıl kolaylaştırdığına bir örnek:

printf(yas>65 ? "Yasli birisiniz.\n" : "Henuz yasli degilsiniz.\n");

Gördüğünüz gibi, hem ifade_2 hem de ifade_3 karakter dizileri ise, sonuç bir karakter dizisidir. “?:” işleci değişmez ifadelerde de kullanılabilir.