社区
C++ 语言
帖子详情
关于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
打赏
收藏
关于const变量的改变
const int a = 0; int *p =(int *)&a; *p = 1; VC下输出a的值还是0,但是内存单元中已经是1; linux下a输出是1; 请各位前辈指点。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
C++中如何修改
const
变量
声明:不同于C语言的
const
变量
修改问题(可以通过指针间接修改
const
变量
的值),这里只讨论C++ 里的
const
。 C++
const
修饰符,表示常量,即如果以后保证不会修改则声明为
const
,否则若要修改,那一开始为什么还要...
const
指针、指向
const
变量
的指针、指向
const
变量
的
const
指针
(1)
const
放在了指针
变量
名的前面,直接修饰指针
变量
----表示指针
变量
的值不能
改变
,在其定义
const
指针的同时必须要初始化; (2)例子: /*
const
指针*/ #include<iostream> using namespace std; int ...
const
变量
的存储位置
const
变量
的存储位置 在C语言和C++中
const
全局
变量
都是存储在只读数据区(.rodata),但是是有条件的,在编译期最初都是将其存储在符号表中。 (1)C语言的
const
全局
变量
只有在第一次被使用时才会在只读数据区分配...
C++中
const
变量
的修改与赋值
title: C++中
const
变量
的修改与赋值 date: 2021-02-25 20:26:16 description: C++中
const
变量
的修改与赋值 出于避免对数据的无意修改的需求,C及C++语言引入了
const
关键字。与C语言中的
const
相比,C++中的
const
...
C语言
const
变量
能不能修改?
笔者在跟同事讨论
变量
存放的分区问题时,讨论到了
const
标识符所标记的
变量
能不能修改这个问题。 按直观理解,
const
关键字标识的
变量
,意味不能修改的
变量
,引申...一、局部的
const
变量
代码验证:首先是局部的con.
C++ 语言
64,654
社区成员
250,484
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章