《Visual C++ 开发从入门到精通》——2.8 常量

简介:

本节书摘来自异步社区出版社《Visual C++ 开发从入门到精通》一书中的第2章,第2.8节,作者: 王东华 , 李樱,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.8 常量

知识点讲解:光盘视频PPT讲解(知识点)第2章常量.mp4

所谓常量是指内容固定不变的量,无论程序怎样变化执行,它的值永远不会变。在编程中,常量常用于保存像圆周率之类的常数。在本节的内容中,将详细介绍C++中常量的基本知识,为读者步入本书后面知识的学习打下基础。

2.8.1 什么是常量

常量是指在程序执行中不变的量,它分为字面常量和符号常量(又称标识符常量)两种表示方法。如25、-3.26、'a'、"constant"等都是字面常量,即字面本身就是它的值。符号常量是一个标识符,对应着一个存储空间,该空间中保存的数据就是该符号常量的值,这个数据是在定义符号常量时赋予的,是以后不能改变的。如C++保留字中的true和false就是系统预先定义的两个符号常量,它们的值分别为数值0和1。

图像说明文字

注意:我们可以认为,声明一个常量与声明一个变量的区别是在语句之前加上了const。但是,声明常量的时候必须对其进行初始化,并且在除声明语句以外的任何地方不允许再对该常量赋值。
如果一个实型文字常量没有作任何说明,那么默认其为双精度型数据。若要表示浮点型数据,要在该文字常量之后加上F(大小写不限);若要表示长双精度型数据,则要加上L(大小写不限)。

cout语句可以输出字符串,这些带着双引号的字符串的全称是字符串常量,它也是一种文字常量。而带着单引号的常量称为字符常量,它与字符串常量是不同的。字符常量只能是一个字符,而字符串常量既可以是一个字符,也可以由若干个字符组成。

在事实上,只要在不改变变量值的情况下,常量可以由一个变量来代替。但是从程序的安全和严谨角度考虑,我们并不推荐这样做。

2.8.2 常量的分类

1.整型常量
整型常量简称整数,它有十进制、八进制和十六进制3种表示方式。

(1)十进制整数。

十进制整数由正号(+)或负号(-)开始的、接着为首位非0的若干个十进制数字所组成。若前缀为正号则为正数,若前缀为负号则为负数,若无符号则认为是正数。如38、-25、+120、74 286等都是符合书写规定的十进制整数。

当一个十进制整数大于等于-2 147 483 648(即-231-1),同时小于等于2 147 483 647(即231-1)时,则被系统看成int型常量;当在2 147 483 648~4 294 967 295(即231-1)范围之内时,则被看成unsigned int型常量;当超过上述两个范围时,则无法用C++整数类型表示,只有把它用实数(即带小数点的数)表示才能够被有效地存储和处理。

(2)八进制整数。

八进制整数由首位数字为0的后接若干个八进制数字(借用十进制数字中的0~7)所组成。八进制整数不带符号位,隐含为正数。如0、012、0377、04056等都是八进制整数,对应的十进制整数依次为0、10、255和2094。

当一个八进制整数大于等于0同时小于等于017777777777时,则称为int型常量,当大于等于020000000000同时小于等于037777777777时,则称为unsigned int型常量,超过上述两个范围的八进制整数则不要使用,因为没有相对应的C++整数类型。

(3)十六进制整数。

十六进制整数由数字0和字母x(大、小写均可)开始的、后接若干个十六进制数字(0~9,A~F或a~f)所组成。同八进制整数一样,十六进制整数也均为正数。如0x0、0X25、0x1ff、0x30CA等都是十六进制整数,对应的十进制整数依次为0、37、511和4 298。

当一个十六进制整数大于等于0,同时小于等于0x7FFFFFFF时,则称其为int型常量,当大于等于0x80000000同时小于等于0xFFFFFFFF时,则称其为unsigned int型常量,超过上述两个范围的十六进制整数没有对应的C++整数类型,所以不能使用它们。

(4)在整数末尾使用u和l字母。

对于任一种进制的整数,若后缀有字母u(大、小写等效),则硬性规定它为一个无符号整型(unsigned int)数,若后缀有字母l(大、小写等效),则硬性规定它为一个长整型(long int)数。在一个整数的末尾,可以同时使用u和l,并且对排列无要求。如25U、0327UL、0x3ffbL、648LU等都是整数,其类型依次为unsigned int、unsigned long int、long int和unsigned long int。

2.字符常量
字符常量简称字符,它以单引号作为起止标记,中间为一个或若干个字符。如'a'、'%'、'/n'、'/012','/125'、'/x4F'等都是合乎规定的字符常量。每个字符常量只表示一个字符,当字符常量的一对单引号内多于一个字符时,则将按规定解释为一个字符。如'a'表示字符a,'/125'解释为字符U(稍后便知是如何解释的)。

因为字符型的长度为1,值域范围是-128~127或0~255,而在计算机领域使用的ASCII字符,其ASCII码值为0~127,正好在C++字符型值域内。所以,每个ASCII字符均是一个字符型数据,即字符型中的一个值。

3.逻辑常量
逻辑常量是逻辑类型中的值,Visual C++用保留字bool表示逻辑类型,该类型只含有两个值,即整数0和1,用0表示逻辑假,用1表示逻辑真。在Visual C ++中还定义了这两个逻辑值所对应的符号常量false和true,false的值为0,表示逻辑假,true的值为1,表示逻辑真。

由于逻辑值是整数0和1,所以它也能够像其他整数一样出现在表达式里,参与各种整数运算。

4.枚举常量
枚举常量是枚举类型中的值,即枚举值。枚举类型是一种用户定义的类型,只有用户在程序中定义它后才能被使用。用户通常利用枚举类型定义程序中需要使用的一组相关的符号常量。枚举类型的定义格式如下。
`
enum <枚举类型名> {<枚举表>};`
它是一条枚举类型定义语句,该语句以enum保留字开始,接着为枚举类型名,它是用户命名的一个标识符,以后就直接使用它表示该类型,枚举类型名后为该类型的定义体,它是由一对花括号和其中的枚举表组成,枚举表为一组用逗号分开的由用户命名的符号常量,每个符号常量又称为枚举常量或枚举值,例如:

enum color{red, yellow, blue};
enum day{Sun, Mon, Tues, Wed, Thur, Fri, Sat};```
第一条语句定义了一个枚举类型color,用来表示颜色,它包含3个枚举值red、yellow和blue,分别代表红色、黄色和蓝色。

第二条语句定义了一个枚举类型day,用来表示日期,它包含7个枚举值,分别表示星期日、星期一至星期六。

一种枚举类型被定义后,可以像整型等预定义类型一样用在允许出现数据类型的任何地方,如可以利用它定义变量。

enum color c1, c2,c3;
enum day today, workday;
c1=red;
workday=Wed;`
第一条语句开始的保留字enum和类型标识符color表示上述定义的枚举类型color,其中enum可以省略不写,后面的3个标识符c1、c2和c3表示该类型的3个变量,每一个变量用来表示该枚举表中列出的任一个值。

第二条语句开始的两个成分(成分之间的空格除外)表示上述定义的枚举类型day,同样,enum可以省略不写,后面的两个标识符today和workday表示该类型的两个变量,每一个变量用来表示该枚举表中列出的7个值中的任一个值。

第三条语句把枚举值red赋给变量c1。

第四条语句把枚举值Wed赋给变量workday。

在一个枚举类型的枚举表中列出的每一个枚举常量都对应着一个整数值,该整数值可以由系统自动确认,也可以由用户指定。若用户在枚举表中一个枚举常量后加上赋值号和一个整型常量,就表示枚举常量被赋予了这个整型常量的值,例如:
`
enum day{Sun=7, Mon=0, Tues, Wed, Thur, Fri, Sat};`
用户指定了Sun的值为7,Mon的值为0。

若用户没有给一个枚举常量赋初值,则系统给它赋予的值是它前一项枚举常量的值加1,若它本身就是首项,则被自动赋予整数0。如对于上述定义的color类型,red、yellow和blue的值分别为0、1和2;对于刚被修改定义的day类型,各枚举常量的值依次为7、0、1、2、3、4、5、6。

由于各枚举常量的值是一个整数,所以可把它同一般整数一样看待,参与整数的各种运算。又由于它本身是一个符号常量,所以当作为输出数据项时,输出的是它的整数值,而不是它的标识符,这一点同输出其他类型的符号常量是一致的。

5.实型常量
实型常量简称实数,它有十进制的定点和浮点两种表示方法,不存在其他进制的表示方法。

(1)定点表示。定点表示的实数简称定点数,它是由一个符号(正号可以省略)后接若干个十进制数字和一个小数点组成,这个小数点可以处在任何一个数字位之前或之后。例如.12、1.2、12.、0.12、-12.40、+3.14、-02037、-36.0等都是符合书写规定的定点数。

(2)浮点表示。浮点表示的实数简称浮点数,它是由一个十进制整数或定点数后接一个字母e(大、小写均可)和一个1至3位的十进制整数组成,字母e之前的部分称为该浮点数的尾数,之后的部分称为该浮点数的指数,该浮点数的值就是它的尾数乘以10的指数幂。如3.23E5、+3.25e-8、2E4、0.376E-15、1e-6、-6.04E+12、43E0、96.e24等都是合乎规定的浮点数,它们对应的数值分别为:3.25×105、3.25×10-8、20 000、0.376×10-15、10-6、-6.04×1012、0.43、96×1024等。

对于一个浮点数,若将它尾数中的小数点调整到最左边第一个非零数字的后面,则称它为规格化(或标准化)浮点数。如21.6E8和-0.074E5是非规定化的,若将它们分别调整为2.16E9和-7.4E3则都是规格化的浮点数。

(3)实数类型的确定。对于一个定点数或浮点数,C++自动按一个双精度数来存储,它占用8个字节的存储空间。若在一个定点数或浮点数之后加上字母f(大、小写均可),则自动按一个单精度数来存储,它占用4个字节的存储空间。如3.24和3.24f,虽然数值相同,但分别代表一个双精度数和一个单精度数,同样,-2.78E5为一个双精度数,而-2.78E5F则为一个单精度数。

6.地址常量
指针类型的值域是0~232-1之间的所有整数,每一个整数代表内存空间中一个对应的单元(若存在的话)的存储地址,每一个整数地址都不允许用户直接使用来访问内存,以防止用户对内存系统数据的有意或无意破坏。但用户可以直接使用整数0作为地址常量,它是C++中唯一允许使用的地址常量,并称为空地址常量,它对应的符号常量为NULL,表示不代表任何地址,在iostream.h等头文件中有此常量的定义。

2.8.3 常量的应用

实例008 用常/变量来保存圆周率PI的值
源码路径 光盘part02changliang  视频路径 光盘视频实例第2章008

本实例的实现文件为changliang.cpp,具体实现代码如下。

#include "stdafx.h"
#include "iostream.h"
int main(void) 
{
     const double _PI_=3.14159;      //圆周率
     double r=0.0;                  //半径
     cin>>r;                       //从命令行读入半径的值
     double area;                 //面积
     area=_PI_*r*r;              //计算面积
     cout<<"面积是"<<area<<endl;
     return 0;
}```

范例015:斐波那契数列
源码路径:光盘演练范例015
视频路径:光盘演练范例015
范例016:哥德巴赫猜想
源码路径:光盘演练范例016
视频路径:光盘演练范例016`
编译执行后将首先需要输入半径,如图2-8所示。


7810be051e27b2fc181e45bf5f80be650b60915c

图2-8 输入半径

按Enter键后输出对应的面积,如图2-9所示。


9c16d97124f73d0f8c4da73c5cfa6a26fc5b2511

图2-9 输出面积

在上述代码中,用常量PI保存了圆周率3.14159的值。

相关文章
|
13天前
|
NoSQL API Redis
最佳实践|如何使用c++开发redis module
本文将试着总结Tair用c++开发redis module中遇到的一些问题并沉淀为最佳实践,希望对redis module的使用者和开发者带来一些帮助(部分最佳实践也适用于c和其他语言)。
76205 0
|
13天前
|
开发框架 编译器 C++
Qt:一个强大的跨平台C++应用程序开发框架
Qt:一个强大的跨平台C++应用程序开发框架
30 1
|
13天前
|
开发框架 Linux C++
Qt:强大的跨平台C++应用程序开发框架
Qt:强大的跨平台C++应用程序开发框架
44 3
|
13天前
|
C++ Python
C++教学——从入门到精通 10.循环
学习编程建议先Python后C++,以避免C++思维影响。课程涵盖for、while和do while循环。for循环示例:`for(int i=0;i&lt;n;i++)`,用于计算114514天后的金币总数(1145140个)。死循环通过`for(int i=0;;i++)`实现,用`break`退出。while循环格式`while(条件)`,同样可解决金币问题。do while循环特点是先执行后判断,结构为`do{...}while(条件)`。
22 2
|
18天前
|
设计模式 存储 算法
C++从入门到精通:3.7阅读和理解开源项目——在实际项目中应用C++编程技巧和规范
C++从入门到精通:3.7阅读和理解开源项目——在实际项目中应用C++编程技巧和规范
|
18天前
|
设计模式 存储 Java
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
|
18天前
|
存储 程序员 编译器
C++从入门到精通:3.4深入理解内存管理机制
C++从入门到精通:3.4深入理解内存管理机制
|
18天前
|
安全 Java 调度
C++从入门到精通:3.3多线程编程
C++从入门到精通:3.3多线程编程
|
18天前
|
安全 编译器 C++
C++从入门到精通:3.2异常处理——掌握C++的异常处理机制,提高程序健壮性
C++从入门到精通:3.2异常处理——掌握C++的异常处理机制,提高程序健壮性
|
18天前
|
编译器 程序员 C++
C++从入门到精通:3.1模板编程——提高代码的复用性和灵活性
C++从入门到精通:3.1模板编程——提高代码的复用性和灵活性