1. 数据类型的介绍
在C语言中,数据类型用于声明变量或函数的返回类型,以及定义函数参数的类型。C语言中的数据类型可以分为以下几类:
1.1 基本数据类型(Basic Data Types)
1.1.1 整形(Integer Types)
①int:常用的整数类型,通常占用4个字节(32位)。
②short:短整型,通常占用2个字节(16位)。
③long:长整型,通常占用4个字节或更多。
④long long:长长整型,通常占用8个字节。
⑤signed 和 unsigned:用于指定整数类型的符号性。
1.1.2 浮点型(Floating-point Types)
①float:单精度浮点型,通常占用4个字节。
②double:双精度浮点型,通常占用8个字节。
③long double:扩展精度浮点型,通常占用10个字节或更多。
1.1.3 字符型(Character Type)
char:通常占用1个字节,可表示ASCII字符。
1.1.4 派生数据类型(Derived Data Types)
① 数组(Array): 用于存储相同类型的多个数据元素。
int numbers[5] = {1, 2, 3, 4, 5}; // 声明一个包含5个整数的数组
②结构体(Structure): 用于存储不同类型的数据元素。
struct Person {
char name[20];
int age;
};
struct Person person; // 声明一个结构体变量
③共用体(Union): 用于在同一内存位置存储不同类型的数据。
union Data {
int i;
float f;
char str[20];
};
union Data data; // 声明一个共用体变量
⑤枚举(Enumeration): 用于定义一组具有命名值的常量。
enum Weekday {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday};
enum Weekday today = Monday; // 声明一个枚举类型的变量
1.1.5 空类型(Void Type)
void
:用于指示函数没有返回值,或指针没有指向任何特定类型的数据。
void printMessage() {
printf("Hello, World!\n");
}
2. 数据类型的取值范围
在C语言中,有符号(signed)和无符号(unsigned)是用来描述整数类型的符号性质的概念。
有符号(signed): 有符号整数类型可以表示正数、负数和零。在有符号整数中,最高位用来表示符号,0表示正数,1表示负数。有符号整数的范围包括正数、负数和零,但负数和正数的数量并不对称,因为负数要多留一个表示。
无符号(unsigned): 无符号整数类型仅能表示非负整数,包括零。在无符号整数中,所有的位都用来表示数值,因此无符号整数的范围是从0开始一直到最大值,没有负数。
例如,对于8位整数类型:有符号整数的范围通常是从-128到127(如果使用补码表示)或者从-127到128(如果使用反码表示)。无符号整数的范围通常是从0到255。
有符号整数(signed):
符号位
↓
1 1 1 1 1 1 1 1 1 0 1 0 1 0 1 0
-|-----------------|----------------
... -3 -2 -1 0
无符号整数(unsigned):
0 1 1 1 1 1 1 1 1 0 1 0 1 0 1 0
-----------------|----------------
... 253 254 255
以下是常见数据类型在C语言中的取值范围(假设使用补码表示有符号整数):
2.1 整形(Integer Types)
①signed char:-128 到 127
②unsigned char:0 到 255
③short 或 short int:-32768 到 32767
④unsigned short 或 unsigned short int:0 到 65535
⑤int:-2147483648 到 2147483647
⑥unsigned int:0 到 4294967295
⑦long 或 long int:-2147483648 到 2147483647
⑧unsigned long 或 unsigned long int:0 到 4294967295
⑨long long 或 long long int:-9223372036854775808 到 9223372036854775807
⑩unsigned long long 或 unsigned long long int:0 到 18446744073709551615
2.2 浮点型(Floating-point Types)
①float:通常为6位有效数字,取值范围取决于实现
②double:通常为10位有效数字,取值范围取决于实现
③long double:通常为10位有效数字或更多,取值范围取决于实现
在不同的系统和编译器中,这些取值范围可能会有所不同。
3. 变量
3.1 变量的创建
在C语言中,要创建一个变量,需要指定变量的名称和数据类型。创建变量的一般语法格式如下:
data_type variable_name;
其中,data_type
是变量的数据类型,variable_name
是变量的名称。下面是一些创建变量的示例:
①整型变量示例:
int age; // 创建一个名为 age 的整型变量
②浮点型变量示例
float salary; // 创建一个名为 salary 的浮点型变量
③字符型变量示例
char grade; // 创建一个名为 grade 的字符型变量
④数组变量示例:
int numbers[5]; // 创建一个名为 numbers 的包含5个整数的数组变量
3.2 变量的分类
在C语言中,变量可以根据其存储位置、作用域和生存期进行分类。主要的变量分类包括:
1.局部变量(Local Variables): 局部变量是在函数或代码块内部声明的变量。它们只能在声明它们的函数或代码块内部访问。局部变量在函数或代码块执行结束后会被销毁,它们的生存期仅限于其所在的函数或代码块。
2.全局变量(Global Variables): 全局变量是在函数外部声明的变量,通常位于程序的顶部。全局变量可以被程序中的所有函数访问,生存期从程序启动到程序结束。全局变量在整个程序执行期间都存在,因此它们的值在程序的不同部分是可见的。
3.静态局部变量(Static Local Variables): 静态局部变量与普通局部变量类似,但其作用域仅限于声明它们的函数内部。静态局部变量在函数执行结束后并不被销毁,而是保留其值直到下一次调用该函数。静态局部变量的声明通常带有
static
关键字。4.静态全局变量(Static Global Variables): 静态全局变量是在函数外部声明,但带有
static
关键字的全局变量。静态全局变量的作用域仍限于声明它们的文件,但是它们不可以被其他文件访问。5.寄存器变量(Register Variables): 寄存器变量是使用
register
关键字声明的变量,用于请求编译器将其存储在寄存器中以加快访问速度。然而,编译器并不一定会将其存储在寄存器中,因此register
关键字在现代编译器中的作用已经不如以前显著。
4. 算数操作符
C语言中常用的算术操作符包括加法、减法、乘法、除法和取模运算。下面是这些算术操作符的使用方法和示例:
①加法操作符(+): 用于将两个数相加。
int result = a + b;
②减法操作符(-): 用于将一个数减去另一个数。
int result = a - b;
③乘法操作符(*): 用于将两个数相乘。
int result = a * b;
④除法操作符(/): 用于将一个数除以另一个数。如果两个操作数都是整数,则结果也是整数;如果其中一个操作数是浮点数,则结果会自动转换为浮点数。
int result1 = a / b; // 整数除法,结果为整数
float result2 = a / b; // 整数除以浮点数,结果会自动转换为浮点数
float result3 = (float)a / b; // 强制类型转换,将整数转换为浮点数再相除
⑤取模操作符(%): 用于求两个数相除的余数。
int remainder = a % b;
5. 单目操作符
单目操作符是一种只作用于一个操作数的操作符,常见的单目操作符包括取地址运算符、取值运算符、递增运算符和递减运算符等。下面是常见的单目操作符及其用法:
①取地址运算符(&): 用于获取变量的地址。
int x = 10;
int *ptr = &x; // ptr 指向变量 x 的地址
②取值运算符(*): 用于获取指针所指向地址上的值。
int x = 10;
int *ptr = &x;
int value = *ptr; // value 等于变量 x 的值,即 10
③递增运算符(++): 用于将变量的值增加 1。
int x = 10;
x++; // 现在 x 的值为 11
④递减运算符(--): 用于将变量的值减少 1。
int x = 10;
x--; // 现在 x 的值为 9
⑤取反运算符(~): 对二进制数的每一位取反。
int x = 5; // 二进制表示为 0000 0101
int y = ~x; // y 的值为 -6,二进制表示为 1111 1010
⑥逻辑非运算符(!): 对布尔值取反,即如果操作数为真,则结果为假;如果操作数为假,则结果为真。
int x = 10;
int y = !x; // y 的值为 0,因为 x 不为零,逻辑非结果为假