Soru geçmişi:
C dilinde karmaşık mantıksal koşulları kontrol etmek için && ve || mantıksal operatörleri tanıtıldı. Bu operatörlerin çalışma özelliği, ikinci operandın, sonuç birinci operand üzerinden kesin olarak belirlenebiliyorsa hesaplanmamasıdır.
Sorun:
Birçok programcı, her iki operandın her zaman hesaplanacağını bekler veya ikinci operandın yan etkilerini yanlış kullanarak mutlaka çalışacağını varsayar. Bu durum pratikte hatalara, kaynak sızıntılarına ve beklenmedik davranışlara yol açar.
Çözüm:
Kısa devre değerlendirmesi mekanizmasını anlamak, özellikle işaretçi, kaynak ve dosya kontrollerinde güvenli yapılar inşa etmeye yardımcı olur. İfade sağ tarafında yan etkilerin kullanılmasını yalnızca bilinçli bir şekilde yapmak gerekir. Güvenli bir kontrol örneği:
if (ptr && ptr->field) { /* ... */ }
Ana özellikler:
if (0 && f()) bölümünde f() ifadesi çalışacak mı?
Hayır, f() fonksiyonu çağrılmayacak çünkü sonuç zaten belirsiz — ifade yanlış, daha fazla hesaplama gereksiz.
Peki, şu yazımda: if (1 || f())?
Yine f() çağrılmayacak: sonuç birinci operand sonrası zaten doğru.
Yan etkileri olan fonksiyonların çağırılma sırasını kontrol etmek için && ve || operatörlerini kullanmak mümkün mü?
Teknik olarak mümkündür ama bu tür bir kontrol okunaksız ve kararsız koda yol açar. Fonksiyonların çağrılma sırasını açık bir şekilde belirtmek daha iyidir, yan etkiler için kısa devre davranışına güvenmemek gerekir.
if (flag || process()) { // ... }
Eğer flag doğruysa, işlem asla çağrılmayacaktır.
Artılar:
Eksiler:
if (!flag) process();
Artılar:
Eksiler: