আসল উত্তরটি হ'ল:
- সংকলক "i == 0" কে অগ্রাধিকার দেয় , যা সত্যকে মূল্যায়ন করে।
- তারপরে এটি i = 1 টি সত্য বা মিথ্যা হিসাবে মূল্যায়ন করবে এবং যেহেতু সংকলিত অ্যাসাইনমেন্ট অপারেটরগুলি কখনই ব্যর্থ হয় না (অন্যথায় তারা সংকলন করবে না), এটি সত্যেরও মূল্যায়ন করে।
- যেহেতু উভয় বিবৃতি সত্য হিসাবে মূল্যায়ন করে, এবং সত্য ও & সত্য সত্যের কাছে মূল্যায়ন করে, যদি বিবৃতিটি সত্যে মূল্যায়ন করে।
প্রমাণ হিসাবে, আপনি যে কোডটি প্রবেশ করেছেন তার জন্য কেবল আপনার সংকলকটির এসএমআউট আউটপুট দেখুন (সমস্ত মন্তব্য আমার নিজস্ব)
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 আউটপুটটি ক্লাং থেকে ছিল, তবে অন্য যে সমস্ত সংকলক আমি তাকিয়েছিলাম সেগুলি একই ধরণের আউটপুট দেয়। এটি সেই সাইটের সমস্ত সংকলকগুলির ক্ষেত্রে সত্য, তারা খাঁটি সি বা সি ++ সংকলক কিনা, কম্পাইলারের মোড পরিবর্তনের জন্য কোনও প্রগমাস ছাড়াই (যা সি ++ সংকলকগুলির জন্য ডিফল্টরূপে সি ++ হয়)
নোট করুন যে আপনার সংকলকটি আসলে i = 1 সেট করে নি, তবে i = সত্য (যার অর্থ কোনও 32-বিট শূন্যের পূর্ণসংখ্যার মান নয়)। কারণ && অপারেটর কেবল কোনও বিবৃতি সত্য বা মিথ্যা কিনা তা মূল্যায়ন করে এবং তারপরে ফলাফল অনুযায়ী ফলাফল নির্ধারণ করে। প্রমাণ হিসাবে, i = 1 থেকে i = 2 পরিবর্তন করার চেষ্টা করুন এবং আপনি নিজের জন্য পর্যবেক্ষণ করতে পারেন যে কোনও কিছুই পরিবর্তিত হবে না। কম্পাইলার এক্সপ্লোরারে কোনও অনলাইন সংকলক ব্যবহার করে নিজের জন্য দেখুন
i
সেট থেকে সেট করা আছে1
।