关于const变量的改变

fanleicge 2012-05-11 11:00:35
const int a = 0;
int *p =(int *)&a;
*p = 1;

VC下输出a的值还是0,但是内存单元中已经是1;
linux下a输出是1;
请各位前辈指点。
...全文
1884 点赞 收藏 46
写回复
46 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
assassin5616 2012-05-22
[Quote=引用 44 楼 的回复:]
lz不对吧,我用vc2008和g++4.6.1运行的结果都一样是a=0,p=1啊
[/Quote]
编译器也有很多版本号的,所以才叫未定义行为嘛。
回复
nmgzhangds 2012-05-20
常量折叠,学习了。C++里对类型转换增加了const_cast运算符。
[Quote=引用 8 楼 的回复:]

常量折叠, 垃圾设置, 毫无意义.

楼主的代码不规范,应当这么做:

PHP code
#include <iostream>
using namespace std;

int main(int argc, char* const argv[]) {
const int n = 1;
int *p_n = const_cast<int*>(&……
[/Quote]
回复
webscan2222 2012-05-19
lz不对吧,我用vc2008和g++4.6.1运行的结果都一样是a=0,p=1啊
回复
dulele198747 2012-05-18
闲的蛋疼啊
回复
deping_chen 2012-05-17
C++常量折叠特性可能会使a完全没有地址。所以代码本身就是有问题的。不必去探究这种错误行为的后果吧,知道这是错误的就行了。
回复
飞天御剑流 2012-05-16
[Quote=引用 26 楼 的回复:]

哎,可怜啊,没有好老师,没有好教材的兄弟们,要学个编程真难啊。
[/Quote]
正是早期的失败教育产生了大量垃圾c++程序员,不管教书的还是做学员的都如此。
回复
飞天御剑流 2012-05-16
[Quote=引用 26 楼 的回复:]

哎,可怜啊,没有好老师,没有好教材的兄弟们,要学个编程真难啊。
[/Quote]
正是早期的失败教育产生了大量垃圾c++程序员,不管教书的还是做学员的都如此。
回复
fqhlysliuyansen 2012-05-16
[Quote=引用 28 楼 的回复:]

语言说了不能这么干,也就是说这么干了后果自负。
所以偏要这么干,干了后出现理解不了的情况又要求解释,这这这……
[/Quote]
哈哈哈
回复
datamining2005 2012-05-15
常量区不可改变
回复
yujie_v 2012-05-15
看具体编译器的。
回复
糊里糊涂 2012-05-14
编译器在涉及到const的常量在编译时直接用值代替了,所以你输出a的值可定没有变化是0,但在内存里你改变了其值为1了。你理解编译器工作原理就好理解了。
回复
bxf_square 2012-05-14
[Quote=引用 27 楼 的回复:]
练出来能在脑袋里模拟程序运行的本事
[/Quote]

为了这句话赞一个.....
哈,哈, 你懂的.....
继续潜水中.....

回复
guoj1997 2012-05-14
C++里的常量分为编译期常量和运行期常量

编译期常量没有内存地址。
如果一个表达式里面的所有运算数都是编译期常量,则此表达式也是编译期常量,此概念是递归的。
使用编译期常量的地方,经过编译后,其对应的机器指令为立即数。
编译期常量可以用于枚举类型时的赋值,或用来定义数组
如:
enum { xxx = compile_const_num };
int ar[compile_const_num];


运行期常量是有内存地址的,其存放地点可能是只读内存区(如字符串常量),
也可能是普通内存区(如普通常量C++大型对象),编译器保证使用常规方法
无法对其进行修改。

const int a = 1;
直接使用a的话,它编译期常量,任何C++编译器都会是直接使用立即数1

顺带说一下sizeof(xxxx)、模板参数template<int n>的n,都是编译期常量
回复
aiyaya730 2012-05-14
编译器拿a当常量,根本不计算,就直接输出了.
回复
mars_man 2012-05-12
语言说了不能这么干,也就是说这么干了后果自负。
所以偏要这么干,干了后出现理解不了的情况又要求解释,这这这……
回复
fox_liucx 2012-05-12
[Quote=引用 15 楼 的回复:]

没事研究这个干什么啊?
既然是const,为啥还要用指针转换出来修改?吃饱了撑的
[/Quote]

++
回复
liutengfeigo 2012-05-12
[Quote=引用 26 楼 的回复:]

哎,可怜啊,没有好老师,没有好教材的兄弟们,要学个编程真难啊。
[/Quote]
唉.我们学校11级的还是谭浩强那本.
要那几发狠的学弟换教材.就是不听.没办法.~
回复
Fangzhen 2012-05-12
我实验的时候,使用gcc的时候没有使用常量折叠,使用g++的时候使用了常量折叠
const在C++中和C中还是有些不同的,在C中是不可修改的量,不是常量,而在C++是常量
回复
自信男孩 2012-05-11
const int a = 0;说明a是一个常量,不可以修改。但没说不可以通过其他间接修改。指针p是指向a的地址,通过*p是可以修改的。
回复
sheldenwade1 2012-05-11
对于VC++,程序中所有的const类型变量都已经在编译的时候被替换为了常量值。
const int a = 0;
int *p =(int *)&a;
*p = 1;
cout<<*p<<" "<<a<<endl;
编译处理的实际是cout<<*p<<" "<<0<<endl;
但内存中仍然存在a的内存空间。
int *p =(int *)&a;
*p = 1;
这两句话也确实会改变a所占内存空间内的值。
对于gcc而言,他的处理有所不同的就是,常量在编译的时候没有做处理,但这样处理会经常产生一些难以排查的错误。
C++标准并没有对const的这种处理没有做强制规定,因此gcc和vc++两种编译器的处理都不能算错误,也不能说gcc就是100%标准,vc++就是错误。
个人更加偏好于vc++的处理,即使修改const,也不会产生违背const语义的操作
回复
加载更多回复
相关推荐
发帖
C++ 语言
创建于2007-09-28

6.0w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
申请成为版主
帖子事件
创建了帖子
2012-05-11 11:00
社区公告
暂无公告