| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 436 人关注过本帖
标题:关于常引用遇到的问题求解
只看楼主 加入收藏
liudongxing
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2015-8-20
结帖率:0
收藏
已结贴  问题点数:20 回复次数:2 
关于常引用遇到的问题求解
试验引用的用法,遇到一个问题,想不通:m和n既然地址都一样,为何输出的值不同?


#include<iostream>
using namespace std;


int main(void)
{
    const int m=200;
    int& n = const_cast<int&>(m);
    n = 300;
    cout << n << endl;
    cout << m << endl;
    cout << &m << endl;
    cout << &n << endl;
      /**********************************
        输出结果为:
        100
        300
        200
        0026FE7C
        0026FE7C
        请按任意继续
        *********************************/

    return 0;
}
搜索更多相关主题的帖子: include 
2015-08-20 22:14
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:10 
这就是编译器对常数的处理。经单步发现,当显示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)

能编个毛线衣吗?
2015-08-20 23:23
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:10 
问题就在这一句
int& n = const_cast<int&>(m);
n = 300;
你修改了一个常量,未定义行为。
2015-08-21 09:28
快速回复:关于常引用遇到的问题求解
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023691 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved