Asıl cevap:
- Derleyici, doğru olarak değerlendirilen "i == 0" a öncelik verir .
- Daha sonra i = 1'i TRUE veya FALSE olarak değerlendirir ve derlenmiş atama işleçleri hiçbir zaman başarısız olmaz (aksi takdirde derlemezler), true olarak da değerlendirilir.
- Her iki ifade de doğru olarak değerlendirildiğinden ve TRUE && TRUE, TRUE olarak değerlendirdiğinden, if ifadesi TRUE olarak değerlendirilir.
Kanıt olarak, girdiğiniz kod için derleyicinizin asm çıkışına bakın (tüm yorumlar benimdir):
mov dword ptr [rbp - 8], 0 ; i = 0;
cmp dword ptr [rbp - 8], 0 ; i == 0?
sete al ; TRUE (=1)
mov cl, al
and cl, 1 ; = operator always TRUE
movzx edx, cl
mov dword ptr [rbp - 8], edx ; set i=TRUE;
test al, 1 ; al never changed,
; so final ans is TRUE
Yukarıdaki asm çıktısı CLANG'dan geliyordu, ancak baktığım diğer tüm derleyiciler benzer çıktı verdi. Bu, o sitedeki tüm derleyiciler için, ister saf C veya C ++ derleyicileri olsun, hepsi derleyicinin modunu değiştirmek için herhangi bir pragmasız (bu varsayılan olarak C ++ derleyicileri için C ++)
Derleyicinizin aslında i = 1 değerini ayarlamadığını, ancak i = TRUE değerini (sıfır olmayan tamsayı değeri olmayan 32 bit anlamına gelir) ayarladığını unutmayın. Çünkü && operatörü yalnızca bir ifadenin DOĞRU veya YANLIŞ olup olmadığını değerlendirir ve ardından sonuçları bu sonuca göre ayarlar. Kanıt olarak, i = 1'i i = 2 olarak değiştirmeyi deneyin ve hiçbir şeyin değişmeyeceğini kendiniz görebilirsiniz. Compiler Explorer'da herhangi bir çevrimiçi derleyiciyi kullanarak kendiniz görün
i
olarak ayarlanır1
.