वास्तविक उत्तर है:
- संकलक "i == 0" को पूर्वता देता है , जो सत्य का मूल्यांकन करता है।
- फिर यह TRUE या FALSE के रूप में i = 1 का मूल्यांकन करेगा, और चूंकि संकलित असाइनमेंट ऑपरेटर कभी भी विफल नहीं होते हैं (अन्यथा वे संकलन नहीं करेंगे), यह भी सच का मूल्यांकन करता है।
- चूंकि दोनों कथन सत्य के रूप में मूल्यांकन करते हैं, और TRUE && TRUE TRUE का मूल्यांकन करता है, यदि कथन कथन TRUE का मूल्यांकन करेगा।
प्रमाण के रूप में, बस आपके द्वारा दर्ज किए गए कोड के लिए अपने संकलक के asm आउटपुट को देखें (सभी टिप्पणियाँ मेरी अपनी हैं):
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
ऊपर का asm आउटपुट CLANG से था, लेकिन अन्य सभी कंपाइलरों पर मैंने समान आउटपुट दिया। यह उस साइट के सभी संकलक के लिए सही है, चाहे वे शुद्ध सी या सी ++ संकलक हों, सभी बिना किसी संकलक के संकलक के मोड को बदलने के लिए (जो डिफ़ॉल्ट रूप से C ++ संकलक के लिए C ++ है)
ध्यान दें कि आपके कंपाइलर ने वास्तव में i = 1 सेट नहीं किया था, लेकिन i = TRUE (जिसका अर्थ है कोई भी 32-बिट शून्य पूर्णांक मान नहीं)। ऐसा इसलिए है क्योंकि && ऑपरेटर केवल मूल्यांकन करता है कि कोई कथन TRUE है या FALSE है, और फिर उस परिणाम के अनुसार परिणाम सेट करता है। प्रमाण के रूप में, i = 1 से i = 2 को बदलने का प्रयास करें और आप अपने लिए देख सकते हैं कि कुछ भी नहीं बदलेगा। कंपाइलर एक्सप्लोरर में किसी भी ऑनलाइन कंपाइलर का उपयोग करके अपने लिए देखें
i
सेट किया गया है तो क्यों स्टेटमेंट दर्ज किया गया है1
।