一、常用的数据类型
32位系统与64位系统的同一数据类型占用大小可能不一致
数据类型 | 存储大小(字节) | 值范围 |
---|---|---|
char | 1 | -128 到 127 或 0 到 255 |
unsigned char | 1 | 0 到 255 |
signed char | 1 | -128 到 127 |
int | 2 或 4 | -32,768 到 32,767(2字节)或 -2,147,483,648 到 2,147,483,647(4字节) |
unsigned int | 2 或 4 | 0 到 65,535(2字节)或 0 到 4,294,967,295(4字节) |
short | 2 | -32,768 到 32,767 |
unsigned short | 2 | 0 到 65,535 |
long | 4 或 8 | -2,147,483,648 到 2,147,483,647(4字节)或 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807(8字节) |
unsigned long | 4 或 8 | 0 到 4,294,967,295(4字节)或 0 到 18,446,744,073,709,551,615(8字节) |
long long | 8 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |
unsigned long long | 8 | 0 到 18,446,744,073,709,551,615 |
float | 4 | 1.2E-38 到 3.4E+38 |
double | 8 | 2.3E-308 到 1.7E+308 |
long double | 10, 12 或 16 | 3.4E-4932 到 1.1E+4932 |
浮点数据类型中,float
的精度为6位有效位,double
有15位有效位 。
二、变量
1.C中的变量声明
变量不进行显式初始化时,默认值为0,指针变量则为NULL
。
2.变量声明与定义的区别
在C语言中,变量声明用于告诉编译器变量的名称及其类型。变量声明不一定分配内存空间,它只是为变量提供了一种使用方式。变量声明可以发生在函数内部(局部变量)或函数外部(全局变量)。
- 定义(Definition):变量定义时,编译器不仅知道变量的类型,还为变量分配了内存空间。定义通常伴随着初始化。
例如:
int number = 10;
这里的 number
既是定义,也是声明。编译器为 number
分配内存,并将其初始化为 10
。
-
声明(Declaration):声明告诉编译器变量的类型和名称,但不分配内存。通常,声明用于在其他文件中引用变量,这时可以使用
extern
关键字。例如:
extern int number;
这里的extern int number
仅仅是声明,表示变量number
在其他地方定义。
3.C 中的左值(Lvalues)和右值(Rvalues)
C 中有两种类型的表达式:
- 左值(lvalue):指向内存位置的表达式被称为左值(lvalue)表达式。左值可以出现在赋值号的左边或右边。
- 右值(rvalue):术语右值(rvalue)指的是存储在内存中某些地址的数值。右值是不能对其进行赋值的表达式,也就是说,右值可以出现在赋值号的右边,但不能出现在赋值号的左边。
变量是左值,因此可以出现在赋值号的左边。数值型的字面值是右值,因此不能被赋值,不能出现在赋值号的左边。下面是一个有效的语句:
int g = 20;
但是下面这个就不是一个有效的语句,会生成编译时错误:
10 = 20;
三、常量
1.整数常量
整数常量可由十进制、八进制、16进制表示,可带后缀U和L(不区分大小写),其中U代表无符号整数(unsigned),L代表长整数(long)。示例如下:
212 /* 合法的 */
215u /* 合法的 */
0xFeeL /* 合法的 */
078 /* 非法的:8 不是八进制的数字 */
032UU /* 非法的:不能重复后缀 */
各种类型的整数常量的实例:
85 /* 十进制 */
0213 /* 八进制 */
0x4b /* 十六进制 */
30 /* 整数 */
30u /* 无符号整数 */
30l /* 长整数 */
30ul /* 无符号长整数 */
2.浮点常量
使用小数形式表示时,必须包含整数部分、小数部分,或同时包含两者。带符号的指数是用 e
或 E
引入的。浮点常量可以带后缀f
几个浮点常量的实例:
3.14159 /* 合法的 */
314159E-5L /* 合法的 */
510E /* 非法的:不完整的指数 */
210f /* 非法的:没有小数或指数 */
.e55 /* 非法的:缺少整数或分数 */
3.字符常量
字符常量可以是一个普通的字符(例如 ‘x’)、一个转义序列(例如 ‘\t’),或一个通用的字符(例如 ‘\u02C0’)。
转义序列码表
转义序列 | 含义 |
---|---|
\\ | \ 字符 |
\' | ' 字符 |
\" | " 字符 |
\? | ? 字符 |
\a | 警报铃声 |
\b | 退格键 |
\f | 换页符 |
\n | 换行符 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ooo | 一到三位的八进制数 |
\xhh... | 一个或多个数字的十六进制数 |
四、定义常量
在 C 中,有两种简单的定义常量的方式:
使用 #define 预处理器: #define 可以在程序中定义一个常量,它在编译时会被替换为其对应的值。
使用 const 关键字:const 关键字用于声明一个只读变量,即该变量的值不能在程序运行时修改。
1.#define 预处理
使用 #define 预处理器定义常量的形式:
#define 常量名 常量值
例如
#define PI 3.14159
在程序中使用该常量时,编译器会将所有的 PI 替换为 3.14159。
2.const关键字
使用 const 前缀声明指定类型的常量,如下所示:
const 数据类型 常量名 = 常量值;
下面的代码定义了一个名为MAX_VALUE的常量:
const int MAX_VALUE = 100;
在程序中使用该常量时,其值将始终为100,并且不能被修改。
3.#define于const区别
#define
与 const
这两种方式都可以用来定义常量,选择哪种方式取决于具体的需求和编程习惯。通常情况下,建议使用 const
关键字来定义常量,因为它具有类型检查和作用域的优势,而 #define
仅进行简单的文本替换,可能会导致一些意外的问题。
#define
预处理指令和 const
关键字在定义常量时有一些区别:
-
替换机制:
#define
是进行简单的文本替换,而const
是声明一个具有类型的常量。#define
定义的常量在编译时会被直接替换为其对应的值,而const
定义的常量在程序运行时会分配内存,并且具有类型信息。 -
类型检查:
#define
不进行类型检查,因为它只是进行简单的文本替换。而const
定义的常量具有类型信息,编译器可以对其进行类型检查。这可以帮助捕获一些潜在的类型错误。 -
作用域:
#define
定义的常量没有作用域限制,它在定义之后的整个代码中都有效。而const
定义的常量具有块级作用域,只在其定义所在的作用域内有效。 -
调试和符号表:使用
#define
定义的常量在符号表中不会有相应的条目,因为它只是进行文本替换。而使用const
定义的常量会在符号表中有相应的条目,有助于调试和可读性。