BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #27696同步于 2009/8/28
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

读《c语言深度剖析》关于const的几点疑问

wangtodie
2009/8/28镜像同步4 回复
1:文中1.11: 精确的说应该是只读的变量,其值在编译时不能被使用,因为编译器在编译时不知道其存储的内容。 2:文中1.11.2: 编译器通常不为普通const 只读变量分配存储空间,而是将它们保存在符号表中,这使得 它成为一个编译期间的值,没有了存储与读内存的操作,使得它的效率也很高。 const int N=5; //此时并未将N 放入内存中 ...... int i=N; //此时为N 分配内存,以后不再分配!//问题2 问题: 1,1.11.1中说其值不能在编译时使用,那么int i=N 是在运行是赋值,是这个意思吗? 2,这里的为N分配内存是什么意思?运行时分配吗?那么第一条语句为什么在运行时不分配内存? 明白的同学帮我解释一下,有点糊涂,谢了
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
hobby机器人#1 · 2009/8/28
1、“其值在编译时不能被使用”应该是说不能把它当作一个类似于宏定义或者真正的常数来使用,比如作为数组定义中数组元素的个数。这点是C语言标准规定的。 换个角度说,const其实叫只读更为合适,他的直接含义就是程序运行时只能对该变量进行读操作而不能进行写操作; 2、这个太深奥了,编译器实现了…… 我觉得对C标准适度研究就可以了吧,编译器实现的话,对于普通的程序员不必了解吧 PS:没有看过这本书,随便掰一掰,LZ勿怪
hobby机器人#2 · 2009/8/28
【 在 hobby 的大作中提到: 】 : 1、“其值在编译时不能被使用”应该是说不能把它当作一个类似于宏定义或者真正的常数来使用,比如作为数组定义中数组元素的个数。这点是C语言标准规定的。 : 换个角度说,const其实叫只读更为合适,他的直接含义就是程序运行时只能对该变量进行读操作而不能进行写操作; : 2、这个太深奥了,编译器实现了…… : ................... 不知道LZ看过这个没有,感觉这里说的还是比较浅显和明白的,虽然这里好像没怎么探讨编译器实现的问题 附件(893.1KB)
wangtodie机器人#3 · 2009/8/28
【 在 hobby 的大作中提到: 】 : 1、“其值在编译时不能被使用”应该是说不能把它当作一个类似于宏定义或者真正的常数来使用,比如作为数组定义中数组元素的个数。这点是C语言标准规定的。 : 换个角度说,const其实叫只读更为合适,他的直接含义就是程序运行时只能对该变量进行读操作而不能进行写操作; : 2、这个太深奥了,编译器实现了…… : ................... 呵呵。没关系,我又看了一下书,好像明白什么意思了 我的理解应该是这样的: 1用const 定义一个变量,编译时并不为普通只读变量非配存储空间,只是在将他们保存到符号表中,并在编译是确定其值,不过这里的普通是指哪些?特殊又包括哪些就不知道了。 2在利用只读变量进行赋值时分配存储空间,并且只分配一次,难道这里就是上面指的“特殊”?
huitailang机器人#4 · 2009/8/28
【 在 wangtodie (YOU) 的大作中提到: 】 : 标 题: 读《c语言深度剖析》关于const的几点疑问 : 发信站: 北邮人论坛 (Fri Aug 28 15:18:20 2009), 站内 : : 1:文中1.11: : 精确的说应该是只读的变量,其值在编译时不能被使用,因为编译器在编译时不知道其存储的内容。 在c语言中,const变量分配在.rodata段,严格意义上讲它不是c++中的const,只是一个“不可修改地址的变量”. 所以编译的时候不能够这样子 const int a =2; int aa[a]; ~~~~~~~ a做右值,运行时才能知道. : 2:文中1.11.2: : 编译器通常不为普通const 只读变量分配存储空间,而是将它们保存在符号表中,这使得 : 它成为一个编译期间的值,没有了存储与读内存的操作,使得它的效率也很高。 : const int N=5; //此时并未将N 放入内存中 这其实是c++的一个特性,c++中的变量有类似与c中#define的性质,即在编译阶段直接做变量替换,并不分配内存地址, 但是如果需要取const变量的地址....(还有几种情况忘了)的时候,编译器就给const分配一个内存空间. : ...... : int i=N; //此时为N 分配内存,以后不再分配!//问题2 ~~~~~~~~~~~ N做右值,所以要给他分配一个内存空间. : : : 问题: : 1,1.11.1中说其值不能在编译时使用,那么int i=N 是在运行是赋值,是这个意思吗? : 2,这里的为N分配内存是什么意思?运行时分配吗?那么第一条语句为什么在运行时不分配内存? : 明白的同学帮我解释一下,有点糊涂,谢了 : -- : : ※ 来源:·北邮人论坛 http://forum.byr.edu.cn·[FROM: 59.64.180.*]