Ternary koşul operatörü (?:) bir koşula göre iki ifadeden birini hesaplamaya ve döndürmeye olanak tanır:
result = cond ? expr_true : expr_false;
int a = 10, b = 0; int max = (a > b) ? a : b; // max = 10
"Eğer bir ternary operatörün iki ifadesi farklı türde nesneler döndürüyorsa (örneğin, pointer ve sıfır), sonuç tipi ne olur?"
Birçok kişi derleyicinin her zaman sonuç tipini "tahmin ettiğini" iddia eder. Gerçekte, eğer ifadelerden biri bir pointer ise ve diğeri 0 veya NULL ise, sonuç pointer tipi olacaktır. Eğer fark daha karmaşıksa — örneğin, farklı türde bir pointer ya da int ve enum türü döndürülüyorsa — beklenmedik bilgi kaybı olabilir ve bazen derleyici hata verebilir.
struct node *p = NULL; void *v = cond ? p : NULL; // tamam void *z = cond ? p : 0; // tamam int i = cond ? 0 : "abc"; // hata: uyumsuz türler
Hikaye
Büyük bir çoklu derleme projesinde, kullanılan ifade
cond ? ptr : 0bir derleyicide pointer, diğerinde ise int olarak döndürüyordu (0 katı olarak int olarak yorumlanıyordu). Sonuç pointer olarak kullanılmaya çalışıldığında sistem çöküyordu.
Hikaye
Bir finans paketinde, dönüş fonksiyonları "çıplak" literallerle ternary operatörü kullanıyordu (
cond ? 0.0 : 1), sonuç tipi dikkatsizlik nedeniyle double oldu, oysa int bekleniyordu; bu da karşılaştırma ve yazdırma hatalarına yol açtı.
Hikaye
Bir kütüphanede yan etki içeren bir ifade ile çağrı yapılıyordu:
flag ? inc(x) : dec(x). Yeniden yapılandırma sırasında gizli bir hata: her iki ifade de (kendi yan etkileri ile) fonksiyonu çağırıyordu, oysa yalnızca birinin çalışması bekleniyordu. İçi içe geçmiş makrolarla karışıklık, değerin çift kez değiştirilmesine yol açtı, bu da yalnızca detaylı test sürecinde keşfedildi.