一 常量的分类

(一)数值型常量

1.整型常量

  整型常量是有且仅包含八进制、十六进制、十进制三种进制的整型常数,按照数值范围大小分为长整型和短整型。长整型和短整型各自又可分为有符号整型和无符号整型
  各进制的表达示例和无符号短整型数值范围如表T1所示。当数值大小超过短整型数值范围时,必须用长整型来表示,在数值后缀Ll

进制 表达实例 数值范围 备注
八进制 011 0277777L [0,0177777] 必须以0作为前缀
十进制 269 75535L [0,65535] 没有前缀
十六进制 0XAB 0X1FFFFL [0x0,0xFFFF] 必须以0X0x作为前缀

注:表达实例中的整型均为无符号整型,此处省略后缀Uu

T1.整型常数的分类、表达实例和数值范围

  • 不加限定的情况下,计算机默认整型是有符号整型。如果要表达无符号整型,需要后缀Uu
  • 八进制数和十六进制数极少用于表达有符号整型。表达有符号整型常用十进制,十进制有符号短整型的范围是[-32768,32767],超出该范围时也应当用长整型的方式表达(后缀Ll)。

2.实型常量(浮点型常量)

  实型常量(浮点型常量)的表达形式有且仅包含十进制数形式、指数形式。例如:0.0 -2.356e5 28E3等。

用指数形式表达时有如下规定:

  • eE前必须有数字;
  • eE后的指数必须为整数。

(二)字符型常量

1.字符常量

  使用单引号''括起单个字符称为字符常量,例如'A' '@'。特殊地,单引号内以反斜杠\前缀的字符称为转义字符。常用转义字符如表T2所示。

单击此处查看表T2
转义字符 含义
\n 换行
\t 水平制表
\v 垂直制表(影响打印机执行操作)
\b 退格
\r 回车
\f 换页(影响打印机执行操作)
\\ 反斜杠符
\’ 单引号符
\" 双引号符
\? 在书写连续多个问号时使用,防止他们被解析成三字母
\a 鸣铃
\ddd 1-3位八进制数所代表的字符,遵循ASCII码
\xhh 1-2位十六进制数所代表的字符,遵循ASCII码

T2.常用转义字符表

2.字符串常量

  使用双引号""括起若干个字符称为字符串常量。存储时,系统会自动在其末尾添加\0作为结束标志。

  • ""也是字符串,其长度为0,称为空串;
  • 结束标志'\0'源于转义字符'\ddd',它在ASCII码表中对应BLANK/NULL

结束标志的存在非常重要,下例指出了其重要性:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int main()
{
char arr1[] = 'abc';
char arr2[] = {'a', 'b', 'c'};
char arr3[] = {'a', 'b', 'c', '\0'};
printf("%s\n", arr1); //结果是abc
printf("%s\n", arr2); //结果是一串乱码
printf("%s\n", arr3); //结果是abc
return 0;
}

  进一步研究发现,arr2因为缺少结束标志,在格式化输出的过程中,当字符'c'输出后,将在其后随机生成一个字符,直至随机生成的字符是结束标志'\0'

(三)符号常量

  使用符号代替常量值。它使用宏定义命令#define来定义:

1
#define 符号名称 常量值 //例如#define PI 3.14

(四)枚举常量

  枚举常量使用关键字enum来定义:

1
2
3
4
5
6
enum Color
{
RED, //默认为0
YELLOW, //默认为1
BLUE //默认为2
};

  也可以自定义常量值。除非自定义,否则常量值总是递增的。

1
2
3
4
5
6
7
enum Color
{
RED, //默认为0
YELLOW = 5,
BLUE, //值为6
GREEN, //值为7
};

二 与只读变量的区别

  只读变量使用const来定义:

1
const int PI = 3.14; 

  只读变量是变量添加关键字const构成的,它和其它变量都存放在一个普通的区域,但是由编译器限定不允许被修改。而常量则存放在只读区域。他们有着本质的区别。下例将这样的区别更形象地体现。

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#define N 5
int main()
{
//const int n = 5;
//char arr1[n] = {0}; //报错
char arr2[N] = {0}; //正确
char arr3[5] = {0};
return 0;
}