高质量程序设计指南:C++/C语言 您所在的位置:网站首页 rtti原理 高质量程序设计指南:C++/C语言

高质量程序设计指南:C++/C语言

#高质量程序设计指南:C++/C语言| 来源: 网络整理| 查看: 265

5.1 认识常量 5.1.1 字面常量

字面常量也许是在程序中使用得最多的常量了,例如,直接出现的各种进制的数字、字符(''括住的单个字符)或字符串(""括住的一系列字符)等。实际上,只存在基本数据类型的字面常量。示例5-1是一些字面常量的例子。

示例5-1

x = -100.25f; #define OPEN_SUCCESS 0x00000001 char c = 'a'; char*pChar="abcdef"; //取字符串常量的地址 int *pInt = NULL;

由于字面常量只能引用,不能修改,所以语言实现一般把它保存在程序的符号表里而不是一般的数据区中。符号表是“只读”的,其实它是一种访问保护机制,千万不要理解为只读存储器(ROM)。除了字符串外,你无法取一个字面常量的地址,例如,int *p = &5;这类语句是错误的。当你试图通过常量字符串的地址修改其中的字符时就会报告“只读”错误。例如:

*(pChar+2)='k'; // 错误,不能修改字面常量的内存单元

如果程序中到处都充斥着各种各样的字面常量,那么就可能存在相同的常量,我们应该把相同的常量合并,以减少内存消耗。有些连接器自动执行常量合并,而有的连接器则提供了常量合并的开关,以优化程序的效率。如果你的编译链接环境支持常量合并,那么请将它打开。

5.1.2 符号常量

存在两种符号常量:用#define定义的宏常量和用const定义的常量。由于#define是预编译伪指令,它定义的宏常量在进入编译阶段前就已经被替换为所代表的字面常量了,因此宏常量在本质上是字面常量。在C语言中,用const定义的常量其实是值不能修改的变量,因此会给它分配存储空间(外连接的)。但是在C++中,const定义的常量要具体情况具体对待:对于基本数据类型的常量,编译器会把它放到符号表中而不分配存储空间,而ADT/UDT的const对象则需要分配存储空间(大对象)。还有一些情况下也需要分配存储空间,例如,强制声明为extern的符号常量或取符号常量的地址等操作,都将强迫编译器为这些常量分配存储空间,以满足用户的要求。

你可以取一个const符号常量的地址:对于基本数据类型的const常量,编译器会重新在内存中创建它的一个拷贝,你通过其地址访问到的就是这个拷贝而非原始的符号常量;而对于构造类型的const常量,实际上它是编译时不允许修改的变量,因此如果你能绕过编译器的静态类型安全检查机制,就可以在运行时修改其内存单元,见示例5-2。

示例5-2

const long lng = 10; long*pl=(long*)&lng; // 取常量的地址 *pl=1000; // “迂回修改” cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有