这就是编译器对常数的处理。经单步发现,当显示m时,并不是在m位置处取数,而是直接将常数0xC8(200)压入栈供cout显示,下述编译后的汇编代码可以很清楚看到:
10:
cout << n << endl;
004017BE
push
offset @ILT+200(std::endl) (004010cd)
004017C3
mov
edx,dword ptr [ebp-8] //ebp-8是变量n的地址,这时n的内容为m的地址,可以看到n实际上已成为一个指针变量,此句把m的地址送到寄存器EDX中
004017C6
mov
eax,dword ptr [edx]
//寄存器间址寻址方式把EDX指向的地址(变量m)处的值(300、0x12c)送到EAX中
004017C8
push
eax
//数据300入栈供cout显示
004017C9
mov
ecx,offset std::cout (00477a10)
004017CE
call
@ILT+255(std::basic_ostream<char,std::char_traits<char> >::operator<<) (00401104)
004017D3
mov
ecx,eax
004017D5
call
@ILT+480(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004011e5)
11:
cout << m << endl;
004017DA
push
offset @ILT+200(std::endl) (004010cd)
004017DF
push
0C8h
//直接把数据200(0xc8)入栈供cout显示,可以看到显示m的值,编译器好像#define m 80一样宏定义替代了
004017E4
mov
ecx,offset std::cout (00477a10)
004017E9
call
@ILT+255(std::basic_ostream<char,std::char_traits<char> >::operator<<) (00401104)
004017EE
mov
ecx,eax
004017F0
call
@ILT+480(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004011e5)