常量(constant)详细讲解
常量,是一种在程序中保持类型和值不变的数据,按照类型有以下几种常量:
1.整型常量
2.实型常量
3.字符常量
4.字符串常量
5.枚举常量
一,整型常量(Integer)
计算机中,数据都是以二进制的形式储存。在C语言程序中,整型常量可用十进制,八进制,十六进制储存。
1.
整型常量的表示形式 | 特点 | 举例 |
---|---|---|
十进制 | 由0~9数字序列组成,数字前可以带正负号 | 如256,-128,+7 |
八进制 | 以八为基的数字系统称为八进制,八进制整数由数字0开头,后跟0~7的数字序列组成,八进制数010相当于十进制数8 | 如021,-017 |
十六进制 | 以十六为基的数字系统称为十六进制,十六进制整数由数字0+字母X开头,后跟0~9,a ~ f ,十六进制0x10相当于十进制的16. | 如0x12和-0x1F是合法的十六进制数,他们分别代表十进制数18,-31 |
2.整形常量的类型确定
长整型常量由常量值后跟L或者I来表示,如-256,1024L
无符号整型常量由常量值后跟U或者u来表示,30u和256U。
【注意】:但是不能表示小于0的数字,如(-30u),
无符号长整型常量由常量值后跟LU,Lu,Iu来表示,如30Lu等。
二,实型常量
1.实行常量(Float)的表示形式
由于计算机中的实型数以浮点(Floating point)的形式表示,小数点位置是可以浮动的,因此,实型常量可以称为实数,或者浮点数。
如,3.14159,-42.8都是实型常量。
(1)十进制小数形式
十进制小数形式与人们表示实数的惯用形式相同,是由。数字和小数点组成的,注意,必须有小数点。如0.123,-12.35,.98,18.等都是合法的表示形式。其中.98等同于0.98,18.等同于18.0,如果没有小数点,则不能作为小数形式的实型数。
(2)指数形式
在实际应用中,有时候会遇到绝对值很大或者很小的数字。这时,我们将其写成指数形式,更加直观方便。如0.00000345写成3.45*10^-6。
编辑程序时,不能输入角标,因此在C语言中以字母e或者E来代表以十为底的指数,
如:0.00000345写成---->>> 3.45e-6
其中e的左边是数值部分(有效数字),可以表示为整数或者小数的形式,且不能省略。右边是指数部分,必须是整数形式,
例如:
3e-2,
3.0e-2,
3.e-2,
.6e-2
都是合法的,而e3, 2e3.0, .e3 是不合法的表示形式。
2.实型常量的类型确定
实型常量隐含按双精度(double)型处理
单精度实型常量由常量值后跟1.25F,1.25e-2f等
长双精度(long double)实型常量由常量值后跟L或者l来表示。如:1.25L等,
三,字符常量
字符 | 含义 | 字符 | 含义 |
---|---|---|---|
‘\n’ | 换行 | ‘\a’ | 响铃报警 |
‘\r’ | 回车(但不换行) | ’ \" ’ | 一个双引号 |
‘\0’ | 空字符(Null) | ‘\’’ | 单引号 |
‘\t’ | 水平制表符 | ‘\’ | 一个反斜杠 |
‘\v’ | 垂直制表 | ‘\?’ | 问号 |
‘\b’ | 退格 | ‘\ddd’ | 1-3位八进制ASCII码值所代表的字符 |
'\f | 走纸换页 | ‘\xdd’ | 1-2位十六进制ASCII码值所代表的字符 |
四,字符串常量
字符串常量是由一对双引号括起来的一个字符序列,如“qwer”,“123”,“w”,等都是字符串。
【注意】:“A”是字符串常量,而不是字符常量。‘A’才是字符常量。
为了便于C程序字符串是否结束,系统对每个用双引号括起来的字符串常量都添加一个字符串结束标志—>> ASCII值为0的空操作符‘\0’。它不起任何控制动作。也不显示。
五,宏常量
宏常量,也称符号常量,是指一个标识符号代表的一个常量。
宏定义的一般形式为:
#define 标识符 字符串
其作用是用制 defne 编译預处理指令定义一个标识符和一个字符串,凡在源程序中发现该标符时,都用其后指定的字符串来替换。宏定义中的标识符被称为宏名( Macro Name ),将種序中出現的宏名替换成字符串的过程称为宏替换( Maem Substitution )。宏名与字符率之间可以有多个空白符,但字符串后只能以换行符终止,且除非特殊需要一般不出现分号。
例如:
#define PI 3.14159
它的作用是在编译预处理时,把程序中在该命令之后出现的所有标识符 P 均用3.141s9代普。其优点在于,能使用户以一个简单的名字代替一个长的字符串,提高程序的可读性
例如:
#include <stdio.h>
#define PI 3.14159//定义一个元的π
#define R 5.3//半径
int main()
{
printf("面积为:%f\n", PI * R * R);//因为是浮点型,所以使用%fprintf("周长为:%f\n", PI * R * 2);//因为是浮点型,所以使用%freturn 0;
}
该程序运行结果如下:
面积为:88.247263
周长为:33.300854
**【编程提示】:**为了与源程序中的变量名有所区别,宏常量名,一般都采用大写字母表示。
分析几个常见错误:
**【常见错误1】:**误以为程序中用双引号括起来的字符事中与宏名相同的字特也会被宏替换
例如,语句“printf(“PI”);”中的 PI 不被替换,因为这里的 vPr 代表一个字符串,不是宏名。
**【常见错误2】**误以为宏替换时进行语法检查
事实上,宏替换只是一种简单的字符串替换,替换时是不进行任何语法检查的,因此只有在对已被宏展开后的源程序进行编译时オ会发现错误。
**【常见错误3】**将宏定义当作 c 语言来使用,在行末加上了分号,或者在宏名后加上了“=”
宏定义是一种编译预处理命令,如果在行末加分号,则会连同分号起进行替换。
例如假设将第2行语句改写为,
# define P 3.14159;
则经过宏展后,第6行语句将被替换成如下语句,从而出现语法错识。
printf("面积为:%f\n",3.14159;*5.3*5.3);
六,枚举常量
所谓“枚举( Lnumention )"就是一一列举之意,当某些量仅由有限个数据值组成时通常用枚举类型来表示。枚举数据类型( Fnumerated Daa Type )描述的是一组整型值的集合須,可用关键字 enum 来定义这种类型。
例如:
enmu reaponse{
no , yes , none};
enmu response answer;
这两条语句首先声明了名为 response 的枚举数据类型,它有三种可能的取值: no 、 yes ,none ,然后用该枚举类型定义了一个名为 answer 的变量。
在枚举类型声明语句中,包含在花括号内的标识符均为整型常量,称为枚举常量。除非特别指定,否则这组常量中的第1个常量的值为0,第二个的值为1,第三个的值为2,往后依次递增1;
在上例中,变量 answer 可被赋予 no 、 yes 、 none 这三种值中的任何一种。
例如:
answer no
相当于:
anewer = 0;
变量 answer 还可以用在条件语句中,
例如
if( anawer == yes )
相当于:
if( answer == 1);
使用枚举类型的目的是提高程序的可读性。
例如,在上例中,使用 no 、 yes 、 none 比傅用0、12的程序可读性更好。
在上例中, response 被称为较举标记( Enumertion Tag ),枚举标记是可选的( Optional )也可以省略不写。
例如:
anum{
no , yes , none}answer ;
C 语言还允许在枚举类型定义时,明确的设置每一个枚举常量的值,例如:
enmu response{
no = -1, yes = 1, none = 0};
若要在枚举定义中增加一种可能的取值,那么在“{”和“}”中间直接添加即可。
例如:
enmu response{
no = -1, yes = 1, none = 0,unser = 2};
//其他类似的例子还有
enmu month{
JAN = 1,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC};
//这里,第一个枚举常量值被明确的设置为1,以下的常量依次递增1.
//再如
enmu weekday{
Sunday,Monday,Tuseday,Wednesday,Thursday,Friday,Saturday};
理解枚举类型的要点是:枚举标记后面变量表中的每个标识符都代表一个整型常数,这些标识符只是一个整型常数的名字,不是字符串,因此它们可以用于使用整型常数值的任何场合,但不能将其作为字符串直接输入和输出。例如下面的语句并不能达到输出字符串" yes ”的目的。
answer = 1;
printf("%s",answer);