常量是固定的值,在程序执行期间不会改变。这些固定的值,又叫做字面量。
常量可以是任何的基本数据类型,比如整数常量、浮点常量、字符常量,或字符串常量,也有枚举常量。
常量就像是常规的变量,只不过常量的值在定义后不能进行修改。
整数常量
整数常量可以是十进制、八进制或十六进制的常量。前缀指定基数:Ox或OX表示十六进制,O表示八进制,不带前缀则默认表示十进制。整数常量也可以带一个后缀,后缀是U和L的组合,U表示无符号整数(unsigned),L表示长整数(long),后缀可以是大写,也可以是小写,U和L的顺序任意。
212//合法
215u//合法
OXFeeL//合法
O78//非法:8不是八进制的数字
O32UU//非法:不能重复后缀
浮点常量
浮点常量是由整数部分、小数点、小数部分和指数部分组成的。可以使用小数形式或者指数形式来表示浮点常量。
当使用小数形式表示时,必须包含小数点、指数,或同时包含两者。
当使用指数形式表示时,必须包含整数部分、小数部分,或同时包含两者。
带符号的指数是用e或E引入的
3.14159//合法
314159E-5L//合法
510E//非法:不完整的指数
210f//非法:没有小数或指数
.e55//非法:缺少整数或分数
以字母e或E代表以10为底的指数,需要注意的是e和E之前必须要有数字,且e和E后面必须为整数
12.34e3//表示12.34*10^3
-67.89e-16//表示-67.89*10^-16
后缀F/f表示该常数用浮点方式存储,相当于float
字符常量
字符常量是括在单引号中,例如,'x'可以存储在char类型的简单变量中。
字符常量可以是一个普通的字符(例如'x')、一个转义序列(例如'\t')或一个通用的字符(例如'\u02C0')。未赋值的系统自动补全为'\0'
普通字符常量:用单引号括起来的一个字符,如'a' , 'B' , '3' , '@' , '#'.不能写成'ab'或'12'.注意单引号只是个界限符,字符是指用单引号括起来的符号,不包括单引号。字符型在内存中是以ASCII码形式存储的,例如字符'a'的ASCII码的十进制为97(A为65),在存储单元中存放的是97的二进制形式。
转义字符:C语言中还有一种特殊形式的字符常量,是以字符\开头的字
转义序列 | 含义 |
---|---|
\\ | \字符 |
\' | '字符 |
\" | "字符 |
\? | ?字符 |
\a | 警告提示音 |
\b | 退格删除符 |
\f | 换页符 |
\n | 换行符 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\o | 八进制形式 |
\x | 十六进制形式 |
\ooo | 一到三位的八进制数 |
\xhh... | 一个或多个数字的十六进制数 |
字符串常量
字符串常量是括在双引号中的。一个字符串包含类似于字符常量的字符:普通的字符、转义序列和通用的字符。
可以使用空格做分隔符,把一个很长的字符串常量进行分行。
下面的实例显示了一些字符串常量。下面这三种形式所显示的字符串是相同的。
1."hello,dear"
2."hello,\
dear"
3."hello," "d" "ear"
地址常量
每一个常量、变量、数组的地址在程序运行期间是不能够改变的,称为地址常量。
定义的变量,在内存中有地址,这个地址是常量。
定义常量
在C中,有两种简单的定义常量的方式:
1.使用#define预处理器
2.使用const关键字
#define预处理器
下面是使用#define预处理器定义常量的形式:
#define identifier value
实例:
#include<stdio.h>
#define LENGTH 10
#define WIDTH 5
#define NEWLINE '\n'
int main(){
int area;
area=LENGTH*WIDTH;
printf("value of area:%d",area);
printf("%c",NEWLINE);
return 0;
}
const关键字
可以使用const前缀声明指定类型的常量,如下所示:
const type variable=value;
实例:
#include<stdio.h>
int main(){
const int LENGTH=10;
const int WIDTH=5;
const char NEWLINE='\n';
int area;
area=LENGTH*WIDTH;
printf("value of area:%d",area);
printf("%c",NEWLINE);
return 0;
}
注意:把常量定义为大写字母形式是一个很好的编程习惯
const常量和#define的区别在于:
-
const常量是在编译时分配内存,而#define是在预处理时进行文本替换,不会分配内存。
-
const常量有类型,可以进行类型检查,而#define没有类型,只是简单的文本替换。
-
const常量可以进行地址取值操作,而#define不可以。
-
const常量可以在多个文件中共享,而#define只能在定义它的文件中使用。
-
const常量可以进行调试,而#define不可以。
因此,建议在定义常量时优先使用const,而不是#define。