常量:
C语言中规定,将一些不可变的值称之为常量。主要有整型常量、浮点数常量和字符常量等。
1、整型常量(整常数)
整型常量是整数类型的数据。可用以下三种形式表示,具体如下:
- 十进制整数,123,-456,0;
- 八进制整数,如0123,-011;
- 十六进制整数,如0x123,-0x12。
2、 实型常量
实型常量也称为浮点数常量,也就是在数学中用到的小数,可以分为 float 单精度浮点数和 double 双精度浮点数两种类型。其中,单精度浮点数后面以F 或 f 结尾,而双精度浮点数则以 D 或 d 结尾。当然,在使用浮点数时也可以在结尾处不加任何的后缀。浮点数常量还可以通过指数形式来表示,具体示例如下:
2e3f 3.6d 0f 3.84d 5.022e+23f
3、 字符常量
字符常量用于表示一个字符,一个字符常量要用一对英文半角格式的单引号(' ')引起来,它可以是英文字母、数字、标点符号以及由转义序列来表示的特殊字符。具体示例如下:
'a' '1' '&' '\r' '0x20'
上面的示例中,'0x20'表示一个空白字符,即在单引号之间只有一个表示空白的空格。之所以能这样表示是因为C 语言采用的是 ASCII 字符集,空格字符在 ASCII 码表(文章底部)中对应的值为'0x20'。
变量
在程序运行期间,随时可能产生一些临时数据,应用程序会将这些数据保存在一些内存单元中,每个内存单元都用一个标识符来标识。这些内存单元我们称之为变量,定义的标识符就是变量名,内存单元中存储的数据就是变量的值。具体如下:
int x = 0,y;
y = x+3;
上面的代码中,第一行代码的作用是定义了两个变量 x 和 y,也就相当于分配了两块内存单元,在定义变量的同时为变量 x 分配了一个初始值 0,而变量 y没有分配初始值,变量 x 和 y在内存中的状态如下图所示。
第二行代码的作用是为变量赋值,在执行第二行代码时,程序首先取出变量x的值,与3相加后,将结果赋值给变量y,此时变量 x 和 y在内存中的状态发生了变化,如下图所示。
从上图以及上面的描述不难发现,变量实际上就是一个临时存放数据的地方。在程序中,可以将指定的数据存放到变量中,方便随时取出来再次进行使用。
变量的数据类型

从上图中可以看出,C 语言中的数据类型可分为 4 种,分别是基本类型、构造类型、指针类型、空类型。
1、整型变量
在程序开发中,经常会遇到 0、-100、1024 等数字,这些数字都可称为整型。整型就是一个不包含小数部分的数。在C 语言中,根据数值的取值范围,可以将整型定义为短整型(shortint)、基本整型(int)和长整型(longint)。下表列举了整数类型的长度及其取值范围。
整数类型的长度及其取值范围
修饰符 | 数据类型 | 占用空间 | 取值范围 |
[signed] | short [int] | 16 位(2 个字节) | -32768 到 32767 (-215 ~ 215-1) |
int | 32 位(4 个字节) | -2147483648 到 2147483647 (-231 ~ 231-1) | |
long [int] | 32 位(4 个字节) | -2147483648 到 2147483647 (-231 ~ 231-1) | |
unsigned | short [int] | 16 位(2 个字节) | 0 到 65535 (0~ 216-1) |
int | 32 位(4 个字节) | 0 到 4294967295 (0 ~ 232-1) | |
long [int] | 32 位(4 个字节) | 0 到 4294967295 (0 ~ 232-1) |
从上表中可以看出,整数类型可分为 short、int 和 long,这三种类型可以被 signed 和 unsigned 修饰。其中,被 signed 修饰的整数类型称为有符号的整数类型,被unsigned 修饰的称为无符号的整数类型。它们之间最大的区别是无符号类型可以存放的正数范围比有符号类型中的范围大一倍。例如,int 的取值范围是 -231~231-1,而unsigned int 的取值范围是 0~232-1。默认情况下,整型数据都是有符号的,此时signed 修饰符可以不用写。需要注意的是,整型数据在内存中占的字节数与所选择的操作系统有关。虽然 C 语言标准中没有明确规定整型数据的长度,但 long类型整数的长度不能短于 int 类型,short类型整数的长度不能短于 int 类型。
2、实型变量
实型变量也可以称为浮点型变量,浮点型变量是用来存储小数数值的。在 C 语言中,浮点型变量分为两种:单精度浮点数(float)、双精度浮点数(double),但是 double 型变量所表示的浮点数比 float 型变量更精确。下表列举了两种不同浮点型数所占用的存储空间大小及取值范围。
浮点类型长度及其取值范围
类型名 | 占用空间 | 取值范围 |
float | 32 位(4 个字节) | 1.4E-45 ~ 3.4E+38,-1.4E-45 ~ -3.4E+38 |
double | 64 位(8 个字节) | 4.9E-324 ~ 1.7E+308, -4.9E-324 ~ -1.7E+308 |
表中列出了两种浮点数类型变量所占的空间大小和取值范围。在取值范围中,E 表示以 10 为底的指数,E后面的“+”号和“-”号代表正指数和负指数,例如,1.4E-45 表示 1.4*10-45。在 C 语言中,一个小数会被默认为 double 类型的值,因此在为一个float 类型的变量赋值时需要注意一点,所赋值的后面一定要加上字母“F”(或者小写“f”),而为 double类型的变量赋值时,其所赋值后面的字符“D”(或小写“d”),可以省略。具体示例如下:
float f = 123.4f; | //为一个float类型的变量赋值,后面必须加上字母f |
double d1 = 100.1; | //为一个double类型的变量赋值,后面可以省略字母d |
double d2 = 199.3d; | //为一个double类型的变量赋值,后面可以加上字母d |
另外,在程序中也可以为一个浮点数类型变量赋予一个整数数值,示例如下:
float f = 100; //声明一个float类型的变量并赋整数值
double d = 100; //声明一个double类型的变量并赋整数值
float 和 double 之间的数据转换
由于浮点型变量是由有限的存储单元组成的,因此只能提供有限的有效数字。在有效位以外的数字将被舍去,这样可能会产生一些误差,例如,将 3.141592612 赋给一个 float 型变量,但它只能保证前 7 位是有效的,即便成3.141593。
3、字符型变量
字符型变量用于存储一个单一字符,在 C语言中用 char 表示,其中每个字符变量都会占用 1 个字节。在给字符型变量赋值时,需要用一对英文半角格式的单引号(' ')把字符括起来,例如,'A'的声明方式如下所示:
char ch = 'A'; //为一个char类型的变量赋值字符'a'
上述代码中,将字符常量'A'放到字符变量ch 中,实际上并不是把该字符本身放到变量的内存单元中去,而是将该字符对应的 ASCII 编码放到变量的存储单元中。例如:ASCII使用编号 65 来对应大写字母“A”,因此变量 ch存储的是整数 65,而不是字母“A”本身。通过一个案例来说明,如例所示。
1 | #include <stdio.h> |
2 | void main() |
3 | { |
4 | char ch1 = 'A'; |
5 | char ch2 = 65; |
6 | printf("%c\n", ch1); |
7 | printf("%c\n", ch2); |
8 | } |
运行结果如图所示。
例中,定义了两个char 类型变量,分别赋值为字符'A'和数字65,然后通过 printf 函数把两个变量的内容以字符形式打印到屏幕上。从图中可以看出,两个变量输出的结果是一样的,这说明对于字符型来说,A和 65 其实没什么区别。严格来说,字符类型也是整型类型。需要注意的是,除了可以直接从键盘上输入的字符(如英文字母,标点符号,数字,数学运算符等)以外,还有一些字符是无法用键盘直接输入的,比如,“回车”,此时需要采用一种新的定义方式——转义字符,它以反斜杠\开头,随后接特定的字符。下表列举了一些常见的转义字符。
部分常见转义字符表
转义字符 | 对应字符 | ASCII 码表中的值 |
'\t' | 制表符(Tab 键) | 9 |
'\n' | 换行 | 10 |
'\r' | 回车 | 13 |
'\"' | 双引号 | 34 |
'\'' | 单引号 | 39 |
'\\' | 反斜杠 | 92 |
----------------------------------------------------------------------------------------------------------------------------------
ASCII码表
计算机使用特定的整数编码来表示对应的字符。我们通常使用的英文字符编码是 ASCII(American Standard Code forInformation Interchange 美国信息交换标准编码)。ASCII 编码是一个标准,其内容规定了把英文字母、数字、标点、字符转换成计算机能识别的二进制数的规则,并且得到了广泛认可和遵守。下表为ASCII 码表的可打印字符部分(0 ~ 127),供大家查阅使用,如表2-6 所示。
表2-6 ASCII 码表
代码 | 字符 | 代码 | 字符 | 代码 | 字符 | 代码 | 字符 |
0 |
| 32 | [空格] | 64 | @ | 96 | ` |
1 |
| 33 | ! | 65 | A | 97 | a |
2 |
| 34 | " | 66 | B | 98 | b |
3 |
| 35 | # | 67 | C | 99 | c |
4 |
| 36 | $ | 68 | D | 100 | d |
5 |
| 37 | % | 69 | E | 101 | e |
6 |
| 38 | & | 70 | F | 102 | f |
7 |
| 39 | ' | 71 | G | 103 | g |
8 | 退格 | 40 | ( | 72 | H | 104 | h |
9 | Tab | 41 | ) | 73 | I | 105 | i |
10 | 换行 | 42 | * | 74 | J | 106 | j |
11 |
| 43 | + | 75 | K | 107 | k |
12 |
| 44 | , | 76 | L | 108 | l |
13 | 回车 | 45 | - | 77 | M | 109 | m |
14 |
| 46 | . | 78 | N | 110 | n |
15 |
| 47 | / | 79 | O | 111 | o |
16 |
| 48 | 0 | 80 | P | 112 | p |
17 |
| 49 | 1 | 81 | Q | 113 | q |
18 |
| 50 | 2 | 82 | R | 114 | r |
19 |
| 51 | 3 | 83 | S | 115 | s |
20 |
| 52 | 4 | 84 | T | 116 | t |
21 |
| 53 | 5 | 85 | U | 117 | u |
22 |
| 54 | 6 | 86 | V | 118 | v |
23 |
| 55 | 7 | 87 | W | 119 | w |
24 |
| 56 | 8 | 88 | X | 120 | x |
25 |
| 57 | 9 | 89 | Y | 121 | y |
26 |
| 58 | : | 90 | Z | 122 | z |
27 |
| 59 | ; | 91 | [ | 123 | { |
28 |
| 60 | < | 92 | \ | 124 | | |
29 |
| 61 | = | 93 | ] | 125 | } |
30 | - | 62 | > | 94 | ^ | 126 | ~ |
31 |
| 63 | ? | 95 | _ | 127 |
|