KK's question 1(for beginner)

我啃 2007-11-18 05:08:47

#include <iostream>
using namespace std;
int main()
{
int const c1=4;
int const c2[4] = {2, 4, 6, 8};
*(int *)&c1 = 5;
*(int *)&c2[2] = 9;
cout<<c1+c2[2]<<endl;
return 0;
}


result ? why ?

...全文
236 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
我啃 2007-12-02
  • 打赏
  • 举报
回复
eatta有点接近了~
yuyunliuhen 2007-12-01
  • 打赏
  • 举报
回复
不管怎样,值得学习^_^
eatta 2007-12-01
  • 打赏
  • 举报
回复
如果你想用加上const的方法来看到修改后的值的话,避免编译器优化.可以这样做
const int *cp=&c1;
cout<<*cp<<endl;
此时可以输出5.
因为它访问了内存
eatta 2007-12-01
  • 打赏
  • 举报
回复
如果不加const转换的话,强制转换时会生成的临时值来保存转换后的值,对该值解引用就得到内存实体值.
如果加了,就没必要生成临时值了,因为类型一样不用转换.
eatta 2007-12-01
  • 打赏
  • 举报
回复
如果这样的话,因为c1本来就是常量地址,所以那个强转相当于没干什么,所以就相当于*&c1,结果仍是4啊,就相当于取地址跟解引用抵消了.编译时优化了.所以没有去读取内存的值
JobSeeker 2007-12-01
  • 打赏
  • 举报
回复
那如果“cout < <*(const int *)&c1 < <endl; ”呢?
eatta 2007-12-01
  • 打赏
  • 举报
回复
cout < <*(int *)&c1 < <endl;
这样做的话,输出不是4而是修改后的5.
因为常量折叠只是将名字用值来代替,在修改之后,该实体值已被改成5,而名字仍是折叠成4没有改变.如果是通过解引用地址去提取值的话,就可以看到值是已改后的值.
eatta 2007-12-01
  • 打赏
  • 举报
回复
c1是常量,而且是在编译时刻能知道的值,所以C++编译器作了常量折叠,用常量的值代替该对象名字.应该是c++定义的,书上没有说是编译器做的.
而数组常量中的元素是没有名字的,只能通过下标操作来提取值,或者类似的指针间访,所以无法做常量折叠.
JobSeeker 2007-12-01
  • 打赏
  • 举报
回复
"理论上这个不是编译器依赖的"
此话怎么讲?
C++标准说const objects can be used as compile-time values in C++, 最终的决定难道不是编译器做的么?
mu_yang 2007-11-19
  • 打赏
  • 举报
回复
const不是不可以被改变,
c只承诺const不被在explicit attempts的情况下被改变.

现在看来c++也只承诺只有explicit的const(比如c1)在运算时保持不变,
c2[2]不属于那种explicit的const,c2才是,c2[2]在编译器看来只是一个表达式*(c2+2).
如果c2[2]可以被优化替换掉(按说对编译器来说这应该不是很难),
那么编译器面临的尴尬就太大了,
比如
int i=1;
c2[i+i]就很可能会与c2[2]不一致 .


所以看来const要么是一个陷阱的盖子,要么就是有盖子的陷阱.


粗浅之见,欢迎拍砖!
我啃 2007-11-19
  • 打赏
  • 举报
回复
呀哈,监考也来啦~

“这个题目不是被多次变形过了嘛? ”

什么时候偶咋不知道。。。在堂里被变形了?
healer_kx 2007-11-19
  • 打赏
  • 举报
回复
13 这个题目不是被多次变形过了嘛?
bluebubble 2007-11-19
  • 打赏
  • 举报
回复
学习~~
c1,c2[2]的值在运行中都已经改变过了,为什么到最后输出的时候却仅仅改变了c2[2]的值呢?

等待高人解答~~
我啃 2007-11-19
  • 打赏
  • 举报
回复
理论上这个不是编译器依赖的,否则我不会无聊到问这种问题,谁能解释一下原理啊??
哈哈oo_v_oo似乎理解有些问题,继续等待讨论和解答
结果很容易知晓,过程就不那么容易了~呵呵~~
mu_yang 2007-11-18
  • 打赏
  • 举报
回复

如果是c++ 做的替换,值得学习
如果是编译器做的替换,我的看法是不值得学习
如同下面的例子一样
http://topic.csdn.net/u/20071117/22/18dfe677-8419-416a-a21f-66c36184c1f6.html
mgtcllxl 2007-11-18
  • 打赏
  • 举报
回复
居然被替换……学习了
mu_yang 2007-11-18
  • 打赏
  • 举报
回复

我关心的问题是,
根据C++语言的定义
题目的答案是确定的还是具有二义性的(或者说编译器依赖的)
PcrazyC 2007-11-18
  • 打赏
  • 举报
回复
想了半天也不知道为什么,不知道数组常量和普通常量有什么区别;

在这个例子中普通常量的值没有改变依然是4,但数组常量的值改变了,变成9了,不知道怎么回事
oo_v_oo 2007-11-18
  • 打赏
  • 举报
回复
及时修正,是13

原因是:c1已经被替代成4了,也就是说

cout<<c1+c2[2]<<endl;
实际编译时,等效为

cout<<4+c2[2]<<endl;
oo_v_oo 2007-11-18
  • 打赏
  • 举报
回复
14
没什么说的
这就是为什么有人对C/C++中的指针有意见的原因之一
加载更多回复(2)

64,649

社区成员

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

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