免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 12657 | 回复: 49
打印 上一主题 下一主题

const总结 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-14 16:27 |只看该作者 |倒序浏览
C/C++中const用的很多,但是总让人犯迷糊。总结下它的用法,如果说的不对还请指正。
1、const修饰的后的对象不是一个常量,它只表示修饰的对象是个只读的对象。
可以用下面的方法证明:
const int a = 1;

switch(i)
{
    case a: ... break;
    case 2: ... break;
    default: ... break;
}
如果i等于1,不会执行case a: 后面的语句。

2、const修饰后的对象,默认的表示此对象只能在该文件中用。
如:const int a = 1; 等同于 static const int a = 1;
如想在其他地方用到a,可以这样定义 extern const int a=1;

3.用附件中图的方法去解释一些比较复杂的声明,可以让一些难懂的声明变得很简单。
比方说const int * const  p;
用图中的说明,很容易解释,p是一个只读的,指向只读整型的指针。
或者更复杂点的:char * const * (* next)();
可以解释为:next是一个指向函数的指针,该函数返回另外一个指针,这个返回的指针指向一个只读的指向char的指针。

以上说明还不够全面,希望各位大虾把知道共享下呀。

p.JPG (93.32 KB, 下载次数: 55)

p.JPG

论坛徽章:
0
2 [报告]
发表于 2008-07-14 16:38 |只看该作者
c就不说了
我一直希望哪位老大把c++中const的所有情况解释一次,比如const用在结构体里的时候,用在全局区的时候,用在局部区的时候等等

论坛徽章:
0
3 [报告]
发表于 2008-07-14 16:40 |只看该作者
C和C++中的const是不一样的
const int a = 1;

switch(i)
{
    case a: ... break;
    case 2: ... break;
    default: ... break;
}
如果i等于1,不会执行case a: 后面的语句。

在C++中这句是会执行的,至少在VC中是这样。

[ 本帖最后由 zszjxh 于 2008-7-14 16:45 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2008-07-14 17:05 |只看该作者
总结的c专家编程上的,鼓励一下

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
5 [报告]
发表于 2008-07-14 17:43 |只看该作者

俺来补充一点

1、旧的#define语法定义的是“宏替换”,不是严格意义上的常量。
    或者说,传统上把#define a 100中的a称为“常量”是不准确的;事实上,前面举例的这个语法有点汇编语言里“立即数”的味道:无需寻址,内嵌于指令。

2、const语法定义了真正的“常量”;编译器必须像普通变量般为它分配存储空间,然后“阻断写操作”。


例:
a.h中:
#define A 100

a.c中:
int AA = 200;


b.h中:
#include “a.h”
extern volatile const int AA;


则:
任何一个包含a.h的实现中,A实际都不存在;反汇编码中,表达式中对A的引用会被立即数100替代。

a.c中,AA是个普通整型全局变量;而在包含b.h的实现文件中,AA是一个常量(但它的值总在偷偷的改变)。

如果去掉volatile声明,AA就可能会被不正确的优化掉;有了这个volatile声明,则语意为: AA是一个外部变量;它的值不允许在本单元修改;但其他单元可能随时修改这个值,因而不允许执行常量优化。

(我没有试过能否在a.c中将AA定义为volatile const,然后在b.h中将其当作普通外部变量引用——理论上这么做是完全可以的。但一旦这样做了,须注意a.c中必须加volatile修饰AA。否则编译器优化后,就可能把AA替换为立即数200,于是导致外部对AA的任何修改都反映不到a.c执行逻辑中)


事实上,c/c++中改变变量访问权限的情况极为常见;如string内部存储区指针显然不是const,但用c_str()取得的指针却是const。

总结: const类似于public/private,它的意思是去掉当前代码块对指定变量的写权限。

论坛徽章:
0
6 [报告]
发表于 2008-07-14 17:49 |只看该作者
C/C++中const用的很多,但是总让人犯迷糊。总结下它的用法,如果说的不对还请指正。
1、const修饰的后的对象不是一个常量,它只表示修饰的对象是个只读的对象。
可以用下面的方法证明:
const int a = 1;

switch(i)
{
    case a: ... break;
    case 2: ... break;
    default: ... break;
}
如果i等于1,不会执行case a: 后面的语句。
-----------------------------------------------------
昨晚刚看了几页中文版C++ primer, 貌似const一节里就把const变量称为常量啊,我还在想这和宏有何区别呢

哎,C++还真复杂,想学又有点怕怕

论坛徽章:
0
7 [报告]
发表于 2008-07-14 18:13 |只看该作者
LZ说的应该是C++的情况

论坛徽章:
0
8 [报告]
发表于 2008-07-14 18:19 |只看该作者
原帖由 davycu 于 2008-7-14 17:49 发表
昨晚刚看了几页中文版C++ primer, 貌似const一节里就把const变量称为常量啊,我还在想这和宏有何区别呢

哎,C++还真复杂,想学又有点怕怕

宏替换所得的是字面值常量(不是可寻址的变量),而const变量是具有常量性质的变量(可寻址,特别地,C++也允许编译器在合理的情况下直接进行与宏相似的常量替换,此时可能在编译后不会有该const变量对象存在)

论坛徽章:
0
9 [报告]
发表于 2008-07-14 18:38 |只看该作者
原帖由 tyc611 于 2008-7-14 18:19 发表

宏替换所得的是字面值常量(不是可寻址的变量),而const变量是具有常量性质的变量(可寻址,特别地,C++也允许编译器在合理的情况下直接进行与宏相似的常量替换,此时可能在编译后不会有该const变量对象存在)


你说的这个好像跟C没区别啊

论坛徽章:
0
10 [报告]
发表于 2008-07-14 19:02 |只看该作者
原帖由 davycu 于 2008-7-14 18:38 发表


你说的这个好像跟C没区别啊

它们是有区别的,不过,我现在也只记得C++中的情况了,期待本版的权威人士予以解答
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP