C++语言提供的常量应该说是为了让直接赋值变得容易理解以及便于修改。常量是一种C++语言既定的标识符,其值在程序运行期间恒定不变。常量的使用至少有3个存在的原因。
q 第一,程序的可读性增强,通常常量标识符定义会清晰的表示那些需要赋值的数字、字符和字符串的用意,方便用户操作程序。
q 第二,程序可能多处需要赋上同样的数字、字符和字符串,常量的使用可以避免因多出书写出现错误。
q 第三,常量的出现方便了同样的值,多处需要改动的情形。通过常量的定义,程序需要改动常量值时只需要在常量定义处修改即可。
C语言中提供了宏的定义实现类似的功能即#define定义常量,C++除了包含了宏定义以外在其基础上进行了改进提供了const来定义常量。与宏定义比较,const定义的常量可以是C++提供的基本数据类型。另外由于有数据类型的常量存在,编译器可以对其进行类型检查,减少意外错误出现。这是宏定义所不具备的优点。所以在C++程序中通常涉及常量定义使用时,建议使用const。如一个整型常量定义如下。
const int COUNT = 123;
const int表示随后定义的为整型常量值,123作为右值赋给COUNT,此时COUNT在程序运行中始终表示123整数。
常量就是给变量赋值的显式书写值,常量名即在使用域中表示随后赋值的常数。与变量相互对应,各种类型都有它的常量表示方式,基本常量类型如下。
1 整型、布尔型常量
整型常量就是显式的在程序中书写不带小数的整数,如123、1432或192111。C++语言中根据数制的需求提供了3种不同的方式来书写常量整数:十进制整数(以10为基数)、八进制整数(以8为基数)和十六进制整数(以16为基数)。
那么编译器如何区分表达的是十进制、八进制还是十六进制数呢?C++语言规定使用数的前一位或者两位来表示常量整数的基数。比如常量整数第一位为1~9,它就是十进制表示方式。常量整数第一位为0,第二位为1~7,就认定其表示方式为八进制。同样如果前两位数为0x或0X,则为十六进制整数的表示方式。这里十六进制后续位数表示1~9,a~f(或A~F)对应10~15。三种表示方式实例定义如下。
const COUNT = 102; //定义整型常量COUNT,其值在程序运行期间都为102(十进制数表示)
const COUNT = 043; //定义整型常量COUNT,其值在程序运行期间都为043(八进制数表示)
const COUNT = 0x43; //定义整型常量COUNT,其值在程序运行期间都为0x43(十六进制数表示)
通常常量的定义标识符建议使用大写字符表示,下面通过打印整型常量三种表示方式的实例,理解整型常量基本表示形式,代码编辑如下所示。
/**
* 实例chapter0406
* 源文件chapter0406.cpp
* 打印不同进制数
*/
#include <iostream>
using namespace std;
/*主程序入口*/
int main()
{
const int INTCOUNT1 = 123; //定义常量整型数INTCOUNT1,使用10进制整数123赋值
const int INTCOUNT2 = 012; //定义常量整型数INTCOUNT2,使用八进制整数012赋值
const int INTCOUNT3 = 0x42; //定义常量整型数INTCOUNT3,使用十六进制整数0x42赋值
cout<<"TheINTCOUNT1:"<<INTCOUNT1<<endl; //打印常量整型INTCOUNT1的值
cout<<"TheINTCOUNT2:"<<INTCOUNT2<<endl; //打印常量整型INTCOUNT2的值
cout<<"TheINTCOUNT3:"<<INTCOUNT3<<endl; //打印常量整型INTCOUNT3的值
/*使用cout提供的控制符打印常量整型INTCOUNT1的值*/
cout<<"TheINTCOUNT1(10):"<<dec<<INTCOUNT1<<endl; //十进制方式打印INTCOUNT1常量值
cout<<"TheINTCOUNT1(8):"<<oct<<INTCOUNT2<<endl; //八进制方式打印INTCOUNT1常量值
cout<<"TheINTCOUNT1(16):"<<hex<<INTCOUNT3<<endl; //十六进制方式打印INTCOUNT1常量值
return 0;
}
Linux平台下需要编译源文件为chapter0406.cpp,相关makefile工程文件编译命令编辑如下所示。
OBJECTS=chapter0406.o
CC=g++
chapter0406: $(OBJECTS)
$(CC)$(OBJECTS) -g -o chapter0406
clean:
rm -fchapter0406 core $(OBJECTS)
submit:
cp -f -rchapter0406 ../bin
cp -f -r*.h ../include
当前shell下执行make命令,生成可执行程序文件,随后通过make submit命令提交程序文件至本实例bin目录,通过cd命令定位至实例bin目录,执行该程序文件运行结果如下所示。
[developer @localhost src]$ make
g++ -c -o chapter0406.o chapter0406.cpp
g++ chapter0406.o -g -o chapter0406
[developer @localhost src]$ make submit
cp -f -r chapter0406 ../bin
cp -f -r *.h ../include
[developer @localhost src]$ cd ../bin
[developer @localhost bin]$ ./chapter0406
The INTCOUNT1:123
The INTCOUNT2:10
The INTCOUNT3:66
The INTCOUNT1(10):123
The INTCOUNT1(8):12
The INTCOUNT1(16):42
上例定义了3个常量,分别使用123(十进制值)、012(八进制值)和0x42(十六进制值)给其赋值。此时三个常量标识符在程序运行期间其值保持不变,接下来通过cout对象打印输出三个常量值,这里执行结果输出却都是十进制数。这是因为cout对象打印输出默认情况下都会使用十进制表示方式,所以这里将三个常量都转换为十进制数打印显示。为了能正确显示对应表示方式的数,下面的部分代码采用了cout对象提供的控制符来控制打印输出结果,三种对应的控制符dec(十进制)、oct(八进制)和hex(十六进制)。加上控制符之后就可以正确显示相对应的表示方式值了。
布尔型常量即为其对应的值,通常0表示false,非0表示true。
2 浮点型常量
前面讲述过浮点型变量通常有三种精度表示即float(单精度)、double(双精度)和long double型。那么在其常量数值中怎么体现这三种精度呢?C++语言提供的方式就是添加后缀来表示。规定在浮点常量数的后面添加f或F后缀用来表示float类型。double型为默认方式,所以可以不用添加后缀表示。对于long double型则需要在其后添加l或L后缀来表示即可。实际定义使用实例如下所示。
2.258f //表示float型常量
2.27e20 //表示double型常量
2.1l //表示long double型常量
3 字符常量
C++中字符通常使用单个字节表示,用来定义使用字符集。对应的常量方式一般使用单引号括起来表示。字符在计算机系统中是以ASCII码值来表示的,比如字符’a’对应的ASCII码值即为97,’A’对应为值65。通常单个字符中内存存储的值都为对应的ASCII值,为什么我们打印出来的却是单个字符而不是对应的ASCII码值。这是因为cout对象从中作的转换的原因,比如字符’a’,在计算机中是以ASCII码值97表示的,输出时cout对象将97转变为所要显示的字符’a’。
这种表示方法有一定优点,有些字符通常不能直接通过键盘终端输入到程序中,此刻就需要进行简单的转义。例如,换行符不能通过键盘上Enter键直接输入到字符串表示一个换行符。此时可以使用’\n’表示换行。C++语言提供的基本常用转义符号如表4-1所示。
表4-1 部分常用转义字符
字符名 | C++代码 | ASCII码 | 十进制ASCII码 |
换行符 | \n | NL | 10 |
回车 | \r | CR | 13 |
响铃 | \a | BEL | 7 |
水平制表符 | \t | HT | 9 |
垂直制表符 | \v | VT | 11 |
反斜杠 | \\ | \ | 92 |
表格只是列出开发中常用的转义字符,更多部分可以参照C++标准文档查阅。下面通过一个字符打印实例,让初学者对于字符常量有初步的了解,代码编辑如下所示。
/**
* 实例chapter0407
* 源文件chapter0407.cpp
* 打印字符常量
*/
#include <iostream>
using namespace std;
/*主程序入口*/
int main()
{
cout<<'a'<<'\n'; //打印输出字符a
cout<<'b'<<'\n'; //打印输出字符b
cout<<'a'<<'\t'<<'b'<<'\n'; //打印输出字符a与b,并以水平制表符相隔
return0;
}
Linux平台下需要编译源文件为chapter0407.cpp,相关makefile工程文件编译命令编辑如下所示。
OBJECTS=chapter0407.o
CC=g++
chapter0407: $(OBJECTS)
$(CC)$(OBJECTS) -g -o chapter0407
clean:
rm -fchapter0407 core $(OBJECTS)
submit:
cp -f -rchapter0407 ../bin
cp -f -r*.h ../include
当前shell下执行make命令,生成可执行程序文件,随后通过make submit命令提交程序文件至本实例bin目录,通过cd命令定位至实例bin目录,执行该程序文件运行结果如下所示。
[developer @localhost src]$ make
g++ -c -o chapter0407.o chapter0407.cpp
g++ chapter0407.o -g -o chapter0407
[developer @localhost src]$ make submit
cp -f -r chapter0407 ../bin
cp -f -r *.h ../include
[developer @localhost src]$ cd ../bin
[developer @localhost bin]$ ./chapter0407
a
b
a b
以上实例直接打印字符常量和转义字符,了解字符常量基本的显示和操作方式。在C++代码中’\n’会转换为换行符,’\t’会转换为水平制表符,在以上小实例中除了打印字符常量以外,遇到转义字符也会将其转译成对应的功能字符。
常量是程序执行期间不变量的数值,其关键字标识为const,在软件开发中有选择的使用常量有助于解决特定场合的问题。常量中还有字符串常量这里先不讲述,后面会有专门的一小节说明字符串。以上初略的讲述了C++语言的基本数据类型及其常量的概念和基本操作方式,更多的练习学习还需要初学者触类旁通不断的去创新尝试,从中总结规律慢慢积累。