Char str1 [] = "ABC"; char str2 [] = "ABC"; const char str3 [] = "ABC"; const char str4 [] = "ABC "; const char * str5 = "ABC"; const char * str6 = "ABC"; cout <boolalpha <(str1 = str2) <Endl; // What is output? Cout <boolalpha <(str3 = str4) <Endl; // What is output? Cout <boolalpha <(str5 = str6) <Endl; // What is output?
What is the output result?
Falsefalsetrue
Why? Disassembly
Char str1 [] = "ABC"; 00cd163e mov eax, dword ptr [String "ABC" (0cd9a40h)] // convert the ABC string (static address) 00cd1643 mov dword ptr [str1], eax // str1 address 0x0018fd00 char str2 [] = "ABC"; 00cd1646 mov eax, dword ptr [String "ABC" (0cd9a40h)] 00cd164b mov dword ptr [str2], eax // str2 address 0x0018fcf4 const char str3 [] = "ABC"; 00cd164e mov eax, dword ptr [String "ABC" (0cd9a40h)] 00cd1653 mov dword ptr [str3], eax // str3 address 0x0018fce 8 const char str4 [] = "ABC"; 00cd1656 mov eax, dword ptr [String "ABC" (0cd9a40h)] 00cd165b mov dword ptr [str4], eax // str4 address 0x0018fsp_const char * str5 = "ABC"; 00cd165e mov dword ptr [str5], offset string "ABC" (0cd9a40h) // str5 points to 0cd9a40hconst char * str6 = "ABC"; 00cd1665 mov dword ptr [str6], offset string "ABC" (0cd9a40h) // str6 points to 0cd9a40hcout <boolalpha <(str1 = str2) <Endl; // What is output? 00cd166c mov ESI, esp 00cd166e mov eax, dword ptr [_ imp_std: Endl (0cdd31ch)] 00cd1673 push eax 00cd1674 Lea ECx, [str1] 00cd1677 Lea edX, [str2] 00cd167a CMP ECx, EDX 1_sete Al 1_mov EDI, esp 00cd1681 movzx ECx, Al 00cd1684 push ECx 00cd1685 mov EBX, esp 00cd1687 push offset STD: boolalpha (0cd1113h) 00cd168c mov ECx, dword ptr [_ imp_std: cout (0cdd318h)] 00cd1692 call dword ptr [_ imp_std:: Basic_ostream <char, STD: char_traits <char >:: operator <(0cdd30ch)] 00cd1698 cmp ebx, esp 00cd169a call @ ILT + 505 (_ rtc_checkesp) (0cdfeh) 00cd169f mov ECx, eax 00cd16a1 call dword ptr [_ imp_std: basic_ostream <char, STD: char_traits <char >:: operator <(0cdd308h)] 00cd16a7 cmp edi, esp 00cd16a9 call @ ILT + 505 (_ rtc_checkesp) (011feh) 00cd16ae mov ECx, eax 00cd16b0 call dword ptr [_ imp_std: basic_o Stream <char, STD: char_traits <char >>:: operator <(0cdd310h)] 00cd16b6 cmp esi, esp 00cd16b8 call @ ILT + 505 (_ rtc_checkesp) (0cd11feh) cout <boolalpha <(str3 = str4) <Endl; // What is output? 00cd16bd mov ESI, esp 00cd16bf mov eax, dword ptr [_ imp_std: Endl (0cdd31ch)] 00cd16c4 push eax 00cd16c5 Lea ECx, [str3] 00cd16c8 Lea edX, [str4] 00cd16cb CMP ECx, EDX 00cd16cd sete Al 1_mov EDI, esp 00cd16d2 movzx ECx, Al 00cd16d5 push ECx 00cd16d6 mov EBX, esp pull offset STD: boolalpha (0cd1113h) 00cd16dd mov ECx, dword ptr [_ imp_std: cout (0cdd318h)] 00cd16e3 call dword ptr [_ imp_std:: Basic_ostream <char, STD: char_traits <char >:: operator <(0cdd30ch)] 00cd16e9 cmp ebx, esp 00cd16eb call @ ILT + 505 (_ rtc_checkesp) (0cdfeh) 00cd16f0 mov ECx, eax 00cd16f2 call dword ptr [_ imp_std: basic_ostream <char, STD: char_traits <char >:: operator <(0cdd308h)] 00cd16f8 cmp edi, esp 00cd16fa call @ ILT + 505 (_ rtc_checkesp) (0cdfeh) 00cd16ff mov ECx, eax 00cd1701 call dword ptr [_ imp_std: basic_o Stream <char, STD: char_traits <char >:: operator <(0cdd310h)] 00cd1707 cmp esi, esp 00cd1709 call @ ILT + 505 (_ rtc_checkesp) (0cd11feh) cout <boolalpha <(str5 = str6) <Endl; // What is output? 00cd170e mov ESI, esp 00cd1710 mov eax, dword ptr [_ imp_std: Endl (0cdd31ch)] 00cd1715 push eax 00cd1716 mov ECx, dword ptr [str5] 00cd1719 CMP ECx, dword ptr [str6] 00cd171c sete DL 1_mov EDI, esp 00cd1721 movzx eax, DL 00cd1724 push eax 1_mov EBX, esp 00cd1727 push offset STD: boolalpha (0cd13h) 00cd172c ECx, dword ptr [_ imp_std: cout (0cdd318h)] 00cd1732 call dword ptr [_ imp_std: basic_ostream <char, STD: char_traits <char> :: operator <(operator)] 00cd1738 cmp ebx, esp 00cd173a call @ ILT + 505 (_ rtc_checkesp) (0cdfeh) 00cd173f mov ECx, eax 00cd1741 call dword ptr [_ imp_std:: basic_ostream <char, STD: char_traits <char >:: operator <(0cdd308h)] 00cd1747 cmp edi, esp 00cd1749 call @ ILT + 505 (_ rtc_checkesp) (0cdfeh) 00cd174e mov ECx, eax 00cd1750 call dword ptr [_ imp_std: basic_ostream <char, STD: char_traits <char >:: operator <(0cdd310h)] 00cd1756 cmp esi, esp 00cd1758 call @ ILT + 505 (_ rtc_checkesp) (0cd11feh)
So here
Str1 (0x0018fd00 )! = Str2 (0x0018fcf4)
Str3 (0x0018fce8 )! = Str4 (0x0018fcdc)
Str5 (0x0cd9a40h) = str6 (0x0cd9a40h)
Result:
False
False
True