ProgramlamaGömülü geliştirici, Backend geliştirici

C dilinde koşul operatörünün (ternary operator) yapısını ve çalışmasını açıklayın. Kullanımında tip dönüştürme ve yan etkilerle ilgili hangi kayalarla karşılaşıyorsunuz?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

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;
  • Sonuç tipi, "genel aritmetik dönüşümlerin" (her iki ifade de sayılarsa) genel kurallarına göre ya da daha büyük operandın tipine göre belirlenir (pointerlar ve yapılar için).
  • Her iki ifadenin de türü uyumlu olmalıdır. Eğer türleri farklıysa, derleyici bunları ortak bir tipe dönüştürmeye çalışır, bazen beklenmeyen sonuçlarla veya veri kaybıyla sonuçlanır.
  • Ternary operatörü, her iki ifadede de yan etkilerin bulunmasına izin verir, ancak yalnızca koşula göre gerekli olan ifade hesaplanır.
  • Karmaşık ifadelerde belirsizlik veya öngörülemeyen davranış sorunları ortaya çıkabilir (özellikle iç içe veya makrolar ve fonksiyonlar ile kullanıldığında).

Örnek

int a = 10, b = 0; int max = (a > b) ? a : b; // max = 10

Soru

"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

Konu hakkında bilgi eksikliğinden kaynaklı gerçek hata örnekleri


Hikaye

Büyük bir çoklu derleme projesinde, kullanılan ifade cond ? ptr : 0 bir 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.