const int a = 1;
int *p = const_cast<int*>(&a);
*p = 2;
cout << “value a=”<< a << endl;
cout << “value *p=” <<*p << endl;
cout << “address a=” <<&a << endl;
cout << “address p=” <<p << endl;
输出:
value a=1
value *p=2
address a=0xbff1d48c
address p=0xbff1d48c
WHY ??? 为什么相同的addr,diff值? 困惑。 谢谢!
答案 0 :(得分:14)
在C ++语言中,尝试修改常量对象是非法的。这种尝试导致未定义的行为。
在您的程序中,*p = 2
赋值会尝试修改常量对象a
。行为未定义。您观察到的奇怪输出正是:未定义的行为。
对未定义的行为没有任何有意义的解释。
(您的编译器可能会将cout << a;
语句翻译为cout << 1;
,因为a
的值无法合法更改。因此,无论您对a
做什么,始终会打印1
。)
答案 1 :(得分:2)
除了AndreyT之外,您可能想知道如果编辑常量会给出未定义的行为,那么为什么我们需要const_cast<>
? const_cast<>
用于获取的写入权限,这些值不受出生时的写保护。只需尝试以下更改,它应该给出正确的行为:
int b = 1; // 'b' is modifiable
const int a = b;
...