关于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;
请各位前辈指点。
...全文
1915 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
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语义的操作
加载更多回复(24)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧