发布网友 发布时间:2022-08-13 11:26
共5个回答
热心网友 时间:2024-11-24 00:04
其实在这里面*(int*)p = 0;,这句话改为c++,就是 *(const_cast<int*>(p)) = 0;const_cast就是将p的const属性去掉了,这句话还是修改了i的,下面是代码的调试结果:感觉是因为const int i=1;这句话导致编译器优化下面的if语句
如果改为int i=1;
输出结果就不一样了
热心网友 时间:2024-11-24 00:04
啥也不说了,看来知识欠缺呐,下边的链接讲的很好,先看链接里人家讲的吧。热心网友 时间:2024-11-24 00:05
(int*)p将(const int *)p 强制类型转换为int *类型(去const),因此*(int*)p可以赋值,但强制类型转换并没有改变p本身,故p本身依旧是const,(强制类型转换 编译器生成了一个临时变量),因此*p当然不能复制(因为还是const的),至于&i=p,而*p != i,这一条我也不知道,所以嘛,主要是留名等大神来的~热心网友 时间:2024-11-24 00:05
这是传说中万恶的常量折叠问题。这里面的常量跟宏定义差不多,编译器在编译的时候会将所有的i都替换成 1,就像#define i 1 一样,这是后在改变i地址里的值,对编译时没有影响的。此时 p 和 &i是相同的,但是去值 *p,和*(&i)确实不同的。因为i无论怎么变都是1.热心网友 时间:2024-11-24 00:06
你看一下这一篇的解释就知道了:blog.chinaunix.net/uid-26853826-id-3365403.html