来看看这段程序的输出是什么

angi_2004 2005-04-11 09:59:47
#include <stdio.h>
int main()
{
const int b = 1;
int *p = (int*)&b;
*p = 2;
printf("%d--%d", *(&b), b);
return 0;
}
...全文
158 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
angi_2004 2005-04-12
  • 打赏
  • 举报
回复
无意中发现的,用bcc32编译运行出来结果2--1,这种情况还第一次见...
ljq14 2005-04-11
  • 打赏
  • 举报
回复
VC6
1--1
根据编译器实现的吧
说不好~~~~
wingjimmy 2005-04-11
  • 打赏
  • 举报
回复
同样道理还有C++
private
等等关键字

但是不提倡这种写法
wingjimmy 2005-04-11
  • 打赏
  • 举报
回复
应该是2--2
直接修改b变量的值,编译器会报错
但是通过指针修改存放b变量的值是可以的
husl 2005-04-11
  • 打赏
  • 举报
回复
考试啊,考试就爱考这些畸形东西

不过要是理解了可能也有一定好处
kobefly 2005-04-11
  • 打赏
  • 举报
回复
上边可能说的不太全,有点问题

因为刚刚在vc上测试了一下,
结果是1--1
printf("%d--%d", *(&b), b);

这句
我看了一下汇编代码,他直接push了2个1
也就是说,他把代码优化了
*(&b)等价于b,所以也用1代替了

如果你要看b地址存储的值
printf("%d--%d", *p, b);
反正p == &b
pcboyxhy 2005-04-11
  • 打赏
  • 举报
回复
考试就是这么垃圾的
  • 打赏
  • 举报
回复
vc2--2
MagicCarmack 2005-04-11
  • 打赏
  • 举报
回复
依赖于编译器的实现


像Kobe学习
sTigerwsk 2005-04-11
  • 打赏
  • 举报
回复
这就是依赖于编译器的代码
不提倡
kobefly 2005-04-11
  • 打赏
  • 举报
回复
#include <stdio.h>
int main()
{
const int b = 1;
int *p = (int*)&b;
*p = 2;
printf("%d--%d", *(&b), b);
return 0;
}
楼主,你这样的程序是要做些什么呢?
测试编译器
对于常量
有的编译器采用常量折叠,也就是说在编译期用常量1代替了b,而你虽然偷偷的改了b存储地方的内容,但那已经属于运行期的事情了
所以
采用了这种技术的编译器输出2,1
如果没有替换,从地址提取就是2,2

所以。。。。。。。。。。。。。。
angi_2004 2005-04-11
  • 打赏
  • 举报
回复
bcc32, 编译出来运行结果 2--1
diaosan 2005-04-11
  • 打赏
  • 举报
回复
2--2 turboC 3.0 下正解 为什么泥?
diaosan 2005-04-11
  • 打赏
  • 举报
回复
1--1 偶是菜鸟,嘿嘿
viyar 2005-04-11
  • 打赏
  • 举报
回复
2--2
QQ503503 2005-04-11
  • 打赏
  • 举报
回复
我用的也是VC,但是结果是2--2
skyofdreams 2005-04-11
  • 打赏
  • 举报
回复
支持一下Kobefly ,很面熟了。
我是标准的忠实拥护者,我们有时是要写一些依赖实现定义的部分。
不过过分了并不好。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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