koşul işleci (ternary operator)

Koşul işleci (conditional operator / ternary operator), C dilinin üç terimli tek işlecidir. Koşul işlecinin terimlerinden her biri herhangi bir ifade olabilir. Koşul işlecinin genel sözdizimi aşağıdaki gibidir:

Koşul işleci birbirinden ayrılmış iki atomdan (token) oluşur. “?” ve “:” atomları, işlecin üç terimini birbirinden ayırır. İşlecin birinci terimi “?” atomundan önce, ikinci terimi “?” ve “:” atomları arasına, üçüncü işleci ise “:” atomundan sonra yazılır:

ifadesinde koşul işlecinin birinci terimi x > 0, ikinci terimi x ve üçüncü terimi -x ifadeleridir. Koşul işlecinin birinci terimi olan ifade lojik olarak yorumlanır. Yani bu ifadenin değeri 0‘dan farklı ise ifade lojik “doğru”, ifadenin değeri 0 ise lojik yanlıştır. Diğer tüm işleçler gibi koşul işleci de bir değer üretir. Koşul işlecinin ürettiği değer, birinci terim doğru ise ikinci terimin değeri, yanlış ise üçüncü terimin değeridir. Yani koşul işleci, bir ifadenin doğru ya da yanlış olmasına göre iki değerden birini üretir:

Yukarıdaki deyimde koşul işleci x > y ifadesinin doğru olması durumunda x değerini aksi halde y değerini üretiyor. Bu durumda, yazılan deyim ile x ve y‘den büyük olanının değeri max değişkenine aktarılmış oluyor.

Okuma kolaylığı sağlaması amacıyla, işlecin birinci teriminin öncelik parantezi içine alınması sık rastlanan bir durumdur:

koşul işlecinin önceliği

Koşul işlecinin öncelik seviyesi virgül işlecinden ve atama işleçlerinden yüksek diğer tüm işleçlerden düşüktür:

Yukarıdaki deyim ile max(x, y) değerinin 5 katının a değişkenine atanmak istendiğini düşünelim. Çarpma işlecinin önceliği koşul işlecinden daha yüksek olduğundan y + 5 ifadesi koşul işlecinin 3. terimi olarak değerlendirilir. Yani x‘in y‘den küçük olması durumunda a değişkenine y * 5 değeri atanır. Deyim şu şekilde yazılmalıydı:

Şimdi de aşağıdaki if deyimine bakalım:

if deyimi ile isleap(year) ifadesinin doğru olup olmadığına göre mday değişkeninin 29 ya da 28‘den büyük olup olmadığı sınanıyor. Koşul ifadesi aşağıdaki gibi yazılsaydı

her zaman doğru olurdu.

koşul işlecinin öncelik yönü

Koşul işlecinin öncelik yönü (associativity) sağdan soladır (right associative). Bir ifade içinde birden fazla koşul işleci varsa, önce en sağdaki işleç ele alınır. Aşağıdaki kod parçasını inceleyin:

Yukarıdaki main işlevinde m değişkenine 6 değeri atanır. İfade aşağıdaki gibi ele alınır:

Şimdi de aşağıdaki koda bakalım:

Yukarıdaki deyimin aşağıdaki gibi bir if deyimine eşdeğer olduğunu görebiliyor musunuz?

Son örnek olarak aşağıdaki kodu inceleyelim:

İşlevin return deyimi ifadesinde birden fazla koşul işleci kullanılmış. return deyimi şöyle bir if yapısı karşılığı kullanılmış:

koşul işlecinin kullanıldığı tipik durumlar

Koşul işlecinin kullanılmasının önerildiği tipik durumlarda genel fikir koşul işlecinin ürettiği değerden aynı ifade içinde faydalanarak bu değeri bir yere aktarmaktır:
1. Koşul işlecinin ürettiği değer bir nesneye atanabilir:

Yukarıdaki deyimde min değişkenine a ve b değerlerinden küçüğü atanıyor.

Yukarıdaki deyimde x’e, x’in mutlak değeri atanıyor.

Yukarıdaki deyimde no_of_days değişkenine y artık yıl ise 366 değilse 365 değeri atanıyor.

2. Bir işlev, koşul işlecinin ürettiği değer ile geri dönebilir:

Yukarıda tanımlanan to_lower işlevi ASCII kodlamasının kullanıldığı bir sistemde büyük harf karakterini küçük harfe dönüştürüyor. to_lower işlevi kendisine gelen karakter büyük harf değilse karakterin kendi kod değerini döndürüyor. İşlevin bu geri dönüş değerini üretmesi için bir if deyimi de kullanılabilirdi:

3. Koşul işlecinin ürettiği değer ile bir işlev çağrılabilir:

Yukarıdaki deyimde, a, b‘ye eşit ise func işlevi x değeri ile, a, b‘ye eşit değil ise y değeri ile çağrılır. Aynı işi gören bir if deyimi de yazılabilirdi:

4. Koşul işlecinin ürettiği değer aynı ifade içinde başka bir işlecinin terimi olarak kullanılabilir:

Koşul işleci if deyiminin bir başka biçimi olarak görülmemelidir. Koşul işleci bir işleçtir (operator) ve bir ifade (expression) oluşturur. Koşul işleci bir kontrol deyimi (control statement) değildir. Özellikle bir ifadeye açılması gereken işlevsel makrolarda (function-like macro) if deyimi kullanma şansımız olmaz. Böyle durumlarda koşul işlecinin kullanımı çok yaygındır:

Eğer koşul işlecinin ürettiği değerden doğrudan faydalanma fikri yok ise koşul işleci yerine if kontrol deyimini tercih etmek okunması daha kolay bir kod oluşturur:

Yukarıdaki deyimde koşul işlecinin ürettiği değerden faydalanılmamış. Böylesi durumlarda koşul işleci yerine if deyimi kullanmak okunabilirlik açısından daha iyi bir seçenek olabilir:

C dilinde koşul işleci bir sol taraf değeri (l value) üretmez.

Koşul işleci bir sol taraf değeri üretmez, yani koşul işleciyle oluşturulan ifade bir nesne göstermez. Aşağıdaki if deyimini inceleyin:

Yukarıdaki if deyiminde x > 0 ifadesinin doğru olması durumunda y değişkenine 3, yanlış olması durumunda ise 7 değeri atanıyor. Bu iş için koşul işlecinin kullanıldığını düşünelim:

Deyim geçersizdir. Atama işlecinin sol terimi nesne gösteren bir ifade değildir.
Aynı nedenden dolayı aşağıdaki ifade de geçersizdir:

Öncelik parantezi içine alınan ifade sol taraf değeri değildir.
C++ dilinde koşul işlecinin 2. ya da 3. teriminin nesne olması durumunda işleç sol taraf değeri üretir. Yani yukarıdaki deyimler C de geçersiz iken C++’da geçerlidir. C’de koşul işlecinden bir sol taraf değeri alınması için şöyle bir hile yapılır:

Yukarıdaki deyimde koşul işleci x > 0 ifadesinin doğru olup olmadığına bağlı olarak ya da z değişkeninin adresini üretiyor. Öncelik parantezi içinde alınmış ifadenin içerik (dereferencing) işlecinin terimi yapıldığını görüyorsunuz. Bu durumda ya x ya y nesnesine erişmiş oluyoruz.

Bazı durumlarda, if deyiminin de koşul işlecinin de kullanılması gerekmez:

Yukarıdaki if deyimi yerine aşağıdaki deyim yazılabilirdi:

Koşul işlecinin üreteceği değerlerin yalnızca 1 veya 0 olabileceği durumlarda, doğrudan karşılaştırma ya da mantıksal işleçleri kullanmak daha iyi teknik olarak değerlendirilmelidir:

Başka bir örnek:

yerine

yazılabilirdi.

koşul işleci ve tür dönüşümü

Koşul işlecinin ikinci ve üçüncü terimlerinin türleri farklı ise, diğer işleçlerde olduğu gibi tür dönüştürme kuralları devreye girer. ival, int türden dval ise double türden değişkenler olsun:

ifadesi, x > 0 koşulu doğru da olsa yanlış olsa, int türdendir.

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