C++ && ve || ne anlama gelir?
Mantıksal AND && operatörünün mantıksal OR || operatörüne göre önceliği vardır. Mantıksal demişken C++, bu operatörler için gerçekten mantıklı davranır, yazının devamında bu dediğime hak vereceksiniz. Şöyle ki; bu iki operatörün de iki operandı vardır bunlara A ve B dersek şimdilik, A ve B durumlarının && operatörü için her ikisinin de DOĞRU olması gerekir. Yani (A && B) ifadesinin doğru çıktı üretebilmesi hem A 'nın hem B 'nin DOĞRU olmasıyla oluşur. C++ bu operandların kontrollerini soldan başlayarak yapar, önce A durumunu kontrol eder, eğer A doğru ise B yi denetler, burası önemli, demek ki A doğru değilse B 'yi denetlemek için enerji ve zaman sarf etmez. Bu da performansımızı doğrudan etkileyen bir durumdur. Bu durumu lehimize kullanmak gerekirse A ve B 'nin yeri önemli olmaya başlar, ne demeye çalışıyorum, (A && B) ile (B && A) aynı performansla çalışmayabilir. Burada önsezilerinizde hangi durumun FALSE üretme olasılığı daha yüksekse onu ilk önce yazarak performans artışı sağlayabilirsiniz gibi bir trick karşımıza çıkmış oluyor. Bu duruma literatürde short-circuit deniyor.
Durumun tam tersi OR || operatörü için de geçerli: (A || B) 'nin DOĞRU çıktı üretebilmesi için, operandlardan herhangi birinin DOĞRU olması yeterli oluyor. C++ 'ın buradaki davranışı yine AND ile benzerlik gösteriyor, A doğru ise B 'yi kontrol etmiyor, çünkü B her ne olursa olsun YANLIŞ ya da DOĞRU, operatör için sonucu değiştirmiyor. Yukarıdaki mantığa göre OR operatörü için de DOĞRU olma olsılığı yüksek olanı ilk önce yazarak performans artışı sağlamamız mümkün. Unutmayın ki bazı durumlarda çok kısa süreler içerisinde çok fazla iş yaptırmamız gerekir mikrodenetleyicimize ya da işlemcimize, zamanla yarıştığımız yerlerde hayat kurtaran yapılardan biridir kendileri.
Mevzuyu örneklendirelim;
Öncelik derken ne demek istediğimize bakalım önce, burası yanlış anlaşılmaya müsait bir konu, aslında konu öncelikten çok nerenin parantez içindeymiş gibi düşünüleceğidir, falseX || falseY && falseZ gibi kaba bir örnek üzerinde konuşmamız gerekirse, ifade C++ tarafından falseX || ( falseY && falseZ ) olarak değerlendirilir. Soldan sağa hareketle, FalseX || olduğunda operandın diğerini mutlaka kontrol etme gereksinimi doğar, yani bir short-circuit durumu oluşmamıştır, ikinci operand parantez içinde AND işleminin ilk operandının FALSE olması münasebetiyle AND in ikinci operandı yani falseZ kontrol edilmez. Finalde FALSE döndürür.
X true olsaydı işler nasıl yürürdü sizce? trueX || falseY && falseZ ; OR operatörü için ilk operand olan trueX, doğru olduğu için ifadenin gerisi kontrol edilmeksizin DOĞRU döndürürdü. Bu durumda AND operatörünün öncelikli meselesi anlaşılmıştır diye düşünüyorum, çünkü aksi olsaydı OR paranteze alınır, DOĞRU döndürür, OR dan dönen DOĞRU ile falseZ AND işleminden YANLIŞ olarak çıkar, final değerimiz YANLIŞ olurdu.
Özlü sözlerde bugün 'e gelecek olursak, bir kodu yazarsınız, çalışır da, ancak bazen sadece çalışması yetmez vaktinde işi bitirmesi gerekir :) Emin olun bunu kullandığım ve işin içinden sıyrıldığım durumlarla karşılaştım.
Herkese kolay gelsin!
Önceki Konu : C++ Operatör Öncelikleri
Sonraki Konu : C++ Unary Operatörler