由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 这个在c++ const不变,不能用相同地址的变量改,咋做的
相关主题
关于C++中一个Class的大小 (转载)C++ 的 问题
c++ 得最基本问题关于C++ copy-constructor 一个奇怪的问题
A aimple C++ question问题
编译器如何分辨返回类型不同的函数?question about c++ constructor
为什么foo1可以而foo2不行?请问这个C++程序有什么问题吗
Please help me take a look at the program一个诡异的const_cast问题
问个简单的memory allocation 的问题。C++一问
问一个简单的C++问题请问关于overloading <<
相关话题的讨论汇总
话题: std话题: cp话题: endl话题: cout话题: char
进入Programming版参与讨论
1 (共1页)
m*********a
发帖数: 3299
1
const char i='x';
const char *cp=&i;
char *p;
p=const_cast(cp);
std::cout<<&i<<" "< address
*p='y';
std::cout<<*p< std::cout<<*cp< std::cout< 同样的
char i='x';
const char *cp=&i;
char *p;
p=const_cast(cp);
std::cout<<&i<<" "< address
*p='y';
std::cout<<*p< std::cout<<*cp< std::cout<
D***n
发帖数: 6804
2
你需要知道编译器是怎么玩的,两段程序在编译器,前半部份基本相同,实际上是:
char i = 'x';
char cp = &i;
char *p;
p = cp;
*p = y; /* i 的内容已经被改成 'y'了 */
不同的地方, 第一段:
cout << *p < cout << *cp << endl;
count << 'x' << endl; 这里编译器直接把常量'x'放这里。
第二段:
cout << *p < cout << *cp << endl;
count << i << endl; 这里编译器读取的是变量i的内容;
m*********a
发帖数: 3299
3
你的意思是const i是和static一样是 compiler preprocessing的
明白了

【在 D***n 的大作中提到】
: 你需要知道编译器是怎么玩的,两段程序在编译器,前半部份基本相同,实际上是:
: char i = 'x';
: char cp = &i;
: char *p;
: p = cp;
: *p = y; /* i 的内容已经被改成 'y'了 */
: 不同的地方, 第一段:
: cout << *p <: cout << *cp << endl;
: count << 'x' << endl; 这里编译器直接把常量'x'放这里。

D***n
发帖数: 6804
4
你可以看看这个打出来什么:
const char i='x';
const char *cp=&i;
char *p;
p=const_cast(cp);
*p='y';
std::cout<<*p< std::cout<<*cp< std::cout< const char *t = &i;
std::cout<<*t< 我这里的结果是 y y x y
D***n
发帖数: 6804
5
这里已经触及到了C++一个很恶心的东西,就是非标实现。
非标实现说白了就是标准在这里没有明确的定义,但是实际上是非实现不可,而且还特
别重要。比如用指针强行修改const variable就是一个例子。
其实这个从编译器角度很容易理解:编译器会在编译期间有关const的东西尽量用代码
段的常量替换。但是它并没有运行程序,不知道指针会真正指向哪块内存。所以出现类
似 &i的内容,它还是会分配一个临时变量。这个临时变量如果被改了如何处理标准没
有定义,我刚才给的例子是GCC的G++出来的结果。
你这里可以看到C++的那些“防止程序员出错”的措施的巨大漏洞。这样的漏洞还有很
多,造成的伤害比带来的好处大多了。
对于这个问题,其实还是C的方法好。
m*********a
发帖数: 3299
6
code::block 也是y y x y
其实这个常量已经改了。
但是我想我是不会这么用的
会造成不consistet
用&i,在deference *
和直接用i是二个不同的值
i 是常量替换,t=&i, *t的是变量

【在 D***n 的大作中提到】
: 你可以看看这个打出来什么:
: const char i='x';
: const char *cp=&i;
: char *p;
: p=const_cast(cp);
: *p='y';
: std::cout<<*p<: std::cout<<*cp<: std::cout<: const char *t = &i;

D***n
发帖数: 6804
7
我的思路是除了几个特别固定的情况,基本不用const,都是裸奔的。

【在 m*********a 的大作中提到】
: code::block 也是y y x y
: 其实这个常量已经改了。
: 但是我想我是不会这么用的
: 会造成不consistet
: 用&i,在deference *
: 和直接用i是二个不同的值
: i 是常量替换,t=&i, *t的是变量

1 (共1页)
进入Programming版参与讨论
相关主题
请问关于overloading <<为什么foo1可以而foo2不行?
请教一个简单字符串程序 (转载)Please help me take a look at the program
C++ formatted output question问个简单的memory allocation 的问题。
问个指针array 的简单问题问一个简单的C++问题
关于C++中一个Class的大小 (转载)C++ 的 问题
c++ 得最基本问题关于C++ copy-constructor 一个奇怪的问题
A aimple C++ question问题
编译器如何分辨返回类型不同的函数?question about c++ constructor
相关话题的讨论汇总
话题: std话题: cp话题: endl话题: cout话题: char