免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: Gegung
打印 上一主题 下一主题

[C] 砖家往这里瞧!!一个简单的c问题 [复制链接]

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
11 [报告]
发表于 2013-09-22 18:18 |只看该作者
本帖最后由 w_anthony 于 2013-09-22 18:21 编辑

回复 10# snakedy


    第一个情况是编译优化,直接定义局部变量const int i = 10,之后遇到对i取值的会直接被10替换(取地址则不同),但是如果你打印*p则是20。这个可以通过查看汇编代码得知,也正是这个替换的原因,所以
const int i = 10;
char n[i];
能在不开C99扩展的C++编译器中通过编译(很多GCC貌似默认开了C99,VC则没有)。
如果const int i = func(),而且func里面是通过键盘输入的话,那么你这里的做法,i会变成20。

第二个情况,由于i是全局变量,编译器把i放到了只读页,因此修改它就挂了。不过不是所有系统的所有编译器都会这么做(虽然可能大多数都是这样)。

你可以总结为如果编译期间就能确定的数值,就不要去修改它,如果你企图去欺骗编译器(欺骗它某个变量是const),那么最后被骗的最惨的可能是你自己。

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
12 [报告]
发表于 2013-09-22 22:22 |只看该作者
“可以的,例如只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。”,我不知道LZ是不是新手,如果他是新手,只看这一句话,脑袋绝对还是蒙的,我不知道你是不是新手,不过听你的口气好像很牛B的样子。回复 5# folklore


   

论坛徽章:
0
13 [报告]
发表于 2013-09-23 09:01 |只看该作者
w_anthony的解释第二种我是明白的,第一种的话,没有太明白,其实我主要想验证前面楼上说的,const定义的变量内容可变性,如果只是针对指针的话,其实代表是不可变的常量是指针地址,而不是变量本身。我的第一种就是对一个常量地址的操作,结果没有变为20,任然维持了10的常量值,也就是说赋值是无效的。

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
14 [报告]
发表于 2013-09-23 13:47 |只看该作者
回复 13# snakedy


    第一种就是编译优化,const数值访问直接在编译期间进行数值替换(打印i的那个地方的i直接被替换为数字10),也就是说编译器并没有严格按照你的语义去办事,所以才会有这样的结果。通过看汇编代码,就能很清楚地了解这件事。对于这个问题已经有无数人提过了,我自己以前也疑惑过。但是我也只能讲到这地步,至于你是否能理解,我也没有办法。

论坛徽章:
0
15 [报告]
发表于 2013-09-23 14:06 |只看该作者
我一直理解的宏定义是用你说的办法在编译期间进行的数据替代,const倒是不知道也与宏一样,你这样说我就明白了,不过还是觉得两者还是有区别的,具体什么区别,就不知道了,呵呵。

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
16 [报告]
发表于 2013-09-23 17:07 |只看该作者
可以。比如只读的状态寄存器。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP