补遗篇之单行道标志const

    面试时,问及const的含义,很多人会答:"const表示常量",这可不是考英文翻译,const应该更近似"只读"而不是常量。
const语法
    对非指针变量,const无论放在类型前或后,都表示变量属性为只读,运行过程中不能也不会赋值修改。如const int a;和int const a;这两种方式const作用相同,都表示a是一个常整型数。
    而const修饰指针时则有所不同,分三种情况:const int *a; int * const a; const int const * a;
    const int* a表示a是指向只读整型数的指针,即内存*a中的整数只读,不能被修改,但指针a可以指向其它地址。

    int* const a;表示a是指向整型数的只读指针,即:指针指向的整型数可修改,但指针a本身不能修改,不能再指向其他地址。

    const int const * a;表示a是指向只读整型数的只读指针,指针指向的整型数不可修改,指针也不可修改。
    有人会有疑问,变量或指针是否修改由程序员自己控制,即使不用const也不影响程序功能实现,为什么要引入它呢?
const的作用
    1) const对外传达有用信息,某变量为const表明在后续代码中不会被修改。所以代码里合理加入const能提高可读性,当然前提是要能看得懂这个暗示,否则就是对牛弹琴了。
    2) const能借助编译器保护那些不希望被改变的变量,防止误修改。一旦声明为const,后面代码中如果试图修改,编译器会报错提醒。这样可以减少bug,提高稳定性。
    3) const可以给编译器一些附加信息,使它产生更高效的优化代码。编译器如果知道某变量只读,值不会改变,就可以利用这一点有针对性做一些优化。
    4) 某些编译器不支持rwdata段(即不支持全局变量),可用const把全局数据定位到rodata段。另外rodata段的数据可直接在多进程间共享,提高空间利用率且无需同步。
const与常量
    回到开始的问题,const和常量是否一回事?不是。常量没有存储空间,是右值。而const的修饰对象依然是左值,有存储空间,只不过被限定到只读空间,这和常量有本质不同。C89中左值定义:“对象是一个命名的存储区域,左值是引用某个对象的表达式”。也就是说有具体存储空间的对象的表达式,就是一个左值!比如const修饰的变量是左值,而相对的,数组名是右值。
    另外为防止指针指向的常量被“曲线”修改,C对于指针间赋值有一个规定:左值必须包含右值所有的限定词。这就限定指向const对象的指针不能赋给指向非const对象的指针,反过来允许。这理所当然,要不,换个指针就能修改原来定义为const的数据:
    const int *p1 =10;
    int *p2;
    p2 = p1;      //这种赋值被禁止,想来也是,制定C标准不可能留下这么大个漏洞
    *p2 = 100;

总结:代码里看到const就象开车看到了单行道标志,利用好它会感觉顺畅,否则会觉得被束缚。一般来说,只要能确定元素为只读,const有益无害。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值