koşul operatörü (ternary operator)

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

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

ifadesinde koşul operatörünün birinci terimi x > 0, ikinci terimi x ve üçüncü terimi -x ifadeleridir. Koşul operatörünün 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 operatörler gibi koşul operatörü de bir değer üretir. Koşul operatörünün ürettiği değer, birinci terim doğru ise ikinci terimin değeri, yanlış ise üçüncü terimin değeridir. Yani koşul operatörü, bir ifadenin doğru ya da yanlış olmasına göre iki değerden birini üretir:

Yukarıdaki deyimde koşul operatörü 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, operatörün birinci teriminin öncelik parantezi içine alınması sık rastlanan bir durumdur:

koşul işlecinin önceliği

Koşul operatörünün öncelik seviyesi virgül operatöründen ve atama operatörlerinden yüksek diğer tüm operatörlerden 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 operatörünün önceliği koşul operatöründen daha yüksek olduğundan y + 5 ifadesi koşul operatörünün 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 operatörü varsa, daha sağdaki koşul operatörnün ürettiği değer daha soldaki koşul operatörünün operandı olur. 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 operatörü kullanılmış. return deyimi şöyle bir if yapısı karşılığı kullanılmış:

koşul operatörünün kullanıldığı tipik durumlar

Koşul operatörünün kullanılmasının önerildiği tipik durumlarda genel fikir koşul operatörünün ürettiği değerden aynı ifade içinde faydalanarak bu değeri bir yere aktarmaktır:
1. Koşul operatörünün ü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 operatörünün ü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 operatörünün ü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 operatörünün ürettiği değer aynı ifade içinde başka bir operatörünün 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 operatörü 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 operatörünün ürettiği değerden doğrudan faydalanma fikri yok ise koşul operatörü yerine if kontrol deyimini tercih etmek okunması daha kolay bir kod oluşturur:

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

C dilinde koşul operatörü bir sol taraf değeri (l value) üretmez.

Koşul işleci bir sol taraf değeri üretmez, yani koşul operatörü ile 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 operatörünün kullanıldığını düşünelim:

Deyim geçersizdir. Atama operatörünün 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 operatörünün 2. ya da 3. teriminin nesne olması durumunda operatör sol taraf değeri üretir. Yani yukarıdaki deyimler C de geçersiz iken C++’da geçerlidir. C’de koşul operatöründen bir sol taraf değeri alınması için şöyle bir hile yapılır:

Yukarıdaki deyimde koşul operatörü 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) operatörünün terimi yapıldığını görüyorsunuz. Bu durumda ya x ya y nesnesine erişmiş oluyoruz.

Bazı durumlarda, if deyiminin de koşul operatörünün de kullanılması gerekmez:

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

Koşul operatörünün üreteceği değerlerin yalnızca 1 veya 0 olabileceği durumlarda, doğrudan karşılaştırma ya da mantıksal operatörleri kullanmak daha iyi teknik olarak değerlendirilmelidir:

Başka bir örnek:

yerine

yazılabilirdi.

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

Koşul operatörünün ikinci ve üçüncü terimlerinin türleri farklı ise, diğer operatörlerde 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.

Share

Necati Ergin

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

Bunlar da ilginizi çekebilir

Kod Eklemek İçin Okuyun