关于C++中常量的理解

关于C++中常量的理解


一 常量的分类

在C++中,常量是区分类型的,从字面形式即可识别其类型。


整型常量(整数)的类型
在上一节中已知道:整型数据可分为int, short int,long int以及unsigned int, unsigned short, unsigned long等类别。整型常量也分为以上类别。为什么将数值常量区分为不同的类别呢?因为在进行赋值或函数的参数虚实结合时要求数据类型匹配。

浮点数的表示方法

一个浮点数可以用两种不同的方式表示:
1) 十进制小数形式。如21.456, -7.98等。它一般由整数部分和小数部分组成,可以省略其中之一(如78.或.06, .0),但不能二者皆省略。C++编译系统把用这种形式表示的浮点数一律按双精度常量处理,在内存中占8个字节。如果在实数的数字之后加字母F或f,表示此数为单精度浮点数,如1234F, -43f,占4个字节。如果加字母L或l,表示此数为长双精度数(long double),在GCC中占12个字节,在Visual C++ 6.0中占8个字节。

2) 指数形式(即浮点形式)。一个浮点数可以写成指数形式,如3.14159可以表示为0.314159×101, 3.14159×100, 31.4159×10-1, 314.159×10-2等形式。在程序中应表示为:0.314159e1, 3.14159e0, 31.4159e-1, 314.159e-2,用字母e表示其后的数是以10为底的幂,如e12表示1012。其一般形式为:
    数符  数字部分  指数部分

上面各数据中的0.314159, 3.14159, 31.4159, 314.159 等就是其中的数字部分。可以看到:由于指数部分的存在,使得同一个浮点数可以用不同的指数形式来表示,数字部分中小数点的位置是浮动的。例如:
    a=0.314159e1;
    a=3.14159e0;
    a=31.4159e-1;
    a=314.159e-2;
以上4个赋值语句中,用了不同形式的浮点数,但其作用是相同的。

在程序中不论把浮点数写成小数形式还是指数形式,在内存中都是以指数形式(即浮点形式)存储的。例如不论在程序中写成314.159或314.159e0, 31.4159e1, 3.14159e2, 0.314159e3等形式,在内存中都是以规范化的指数形式存放,如图2.3所示。


图 2.3
 

数字部分必须小于1,同时,小数点后面第一个数字必须是一个非0数字,例如不能是0.0314159。因此314.159和314.159e0, 31.4159e1, 3.14159e2, 0.314159e3在内存中表示成0.314159×103。存储单元分为两部分,一部分用来存放数字部分,一部分用来存放指数部分。为便于理解,在图2.3中是用十进制表示的,实际上在存储单元中是用二进制数来表示小数部分,用2的幂次来表示指数部分的。

对于以指数形式表示的数值常量,也都作为双精度常量处理。

字符常量

1) 普通的字符常量
用单引号括起来的一个字符就是字符型常量。如'a', '#', '%', 'D'都是合法的字符常量,在内存中占一个字节。注意:
  • 字符常量只能包括一个字符,如'AB' 是不合法的。
  • 字符常量区分大小写字母,如'A'和'a'是两个不同的字符常量。
  • 撇号(')是定界符,而不属于字符常量的一部分。如cout<<'a';输出的是一个字母"a",而不是3个字符"'a' "。


3) 字符数据在内存中的存储形式及其使用方法
将一个字符常量存放到内存单元时,实际上并不是把该字符本身放到内存单元中去,而是将该字符相应的ASCII代码放到存储单元中。如果字符变量c1的值为'a',c2的值为'b',则在变量中存放的是'a'的ASCII码97,'b' 的ASCII码98,如图2.4(a)所示,实际上在内存中是以二进制形式存放的,如图2.4(b)所示。

 

图 2.4

既然字符数据是以ASCII码存储的,它的存储形式就与整数的存储形式类似。这样,在C++中字符型数据和整型数据之间就可以通用。一个字符数据可以赋给一个整型变量,反之,一个整型数据也可以赋给一个字符变量。也可以对字符数据进行算术运算,此时相当于对它们的ASCII码进行算术运算


字符串常量

用双撇号括起来的部分就是字符串常量,如"abc","Hello!","a+b","Li ping"都是字符串常量。字符串常量"abc"在内存中占4个字节(而不是3个字节),见图2.5。

 

图 2.5

编译系统会在字符串最后自动加一个'\0'作为字符串结束标志。但'\0'并不是字符串的一部分,它只作为字符串的结束标志。如
   cout<<"abc"<<endl;
输出3个字符abc,而不包括'\0'。

注意: "a"和'a'代表不同的含义,"a"是字符串常量,'a' 是字符常量。前者占两个字节,后者占1个字节。请分析下面的程序片段:
    char c;  //定义一个字符变量
    c='a';  //正确
    c="a";  //错误,c只能容纳一个字符

请思考:字符串常量"abc\n"包含几个字符?不是5个而是4个字符,其中"\n"是一个转义字符。但它在内存中占5个字节(包括一个"\0"字符) 。编译系统遇到"\"时就会把它认作转义字符的标志,把它和其后的字符一起作为一个转义字符。



符号常量

为了编程和阅读的方便,在C++程序设计中,常用一个符号名代表一个常量,称为符号常量,即以标识符形式出现的常量。

【例2.3】符号常量的使用。
  1. #include <iostream>
  2. using namespace std;
  3. #define PRICE 30 //注意这不是语句,末尾不要加分号
  4. int main ( )
  5. {
  6. int num,total;
  7. num=10;
  8. total=num * PRICE;
  9. cout<<"total="<<total<<endl;
  10. return 0;
  11. }
程序中用预处理命令#define指定PRICE在本程序单位中代表常量30,此后凡在本程序单位中出现的PRICE都代表30,可以和常量一样进行运算,程序运行结果为
    total=300
请注意符号常量虽然有名字,但它不是变量。它的值在其作用域(在本例中为主函数)内是不能改变的,也不能被赋值。如用赋值语句"PRICE=40;"给PRICE赋值是错误的。 使用符号常量的好处是:含义清楚,在需要改变一个常量时能做到"一改全改"。 如:
    #define PRICE 35

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章