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的是变量
|