上一篇我们把 C 语言的基础概念过了一遍,算是正式入门了。这一篇我们来学习数据类型和变量,这是编写更复杂程序的核心基础,也是我之前反复踩坑的地方,今天就把这些知识彻底梳理清楚。
一、数据类型介绍
C 语言提供了丰富的数据类型,用来描述生活中各种各样的数据。我们可以把它分为两大类:
基本数据类型:最基础的原子类型
- 基本数据类型:最基础的原子类型
- 整型:int、short、long、long long
- 字符型:char
- 浮点型:float、double
- 构造数据类型:由基本类型组合而成
- 数组、结构体、枚举、联合体等
不同的数据类型,在内存中占用的大小不同,能表示的数据范围也不同,这是我们选择类型的核心依据。
二、signed 和 unsigned
在整型和字符型前,我们可以加上 signed 或 unsigned 来修饰:
- signed:表示有符号数,即可以表示正数、负数和 0
- unsigned:表示无符号数,只能表示非负数(0 和正数)
举个例子:
- signed char:范围是 -128 ~ 127
- unsigned char:范围是 0 ~ 255
小提示:默认情况下,int、char 等都是 signed 类型,只有在需要表示纯正数(比如年龄、计数)时,才会用 unsigned。
三、数据类型的取值范围
不同数据类型的取值范围,是由它在内存中占用的字节数决定的。我们可以通过 <limits.h> 和 <float.h> 头文件里的宏来查看:
| char | 1 | signed: -128 ~ 127unsigned: 0 ~ 255 |
| short | 2 | signed: -32768 ~ 32767 |
| int | 4 | signed: -2^31 ~ 2^31-1 |
| long | 4/8 | 至少和 int 一样大 |
| long long | 8 | -2^63 ~ 2^63-1 |
| float | 4 | 约 ±3.4e±38,精度约 6 位小数 |
| double | 8 | 约 ±1.7e±308,精度约 15 位小数 |
经验:日常开发中,整数用 int 足够,小数用 double 精度更高,特殊场景(如嵌入式)才会考虑更小的类型。
四、变量
变量就是在内存中存储数据的容器,我们需要先定义,再使用。
1. 变量的定义
语法:类型 变量名 = 初始值;
int age = 18; // 整型变量
char gender = 'M'; // 字符型变量
double score = 95.5;// 浮点型变量
2. 变量的命名规则
- 只能由字母、数字、下划线组成
- 不能以数字开头
- 不能和 C 语言关键字重名
- 见名知意,比如用 age 而不是 a
3. 变量的作用域
- 局部变量:定义在函数内部,只在函数内有效
- 全局变量:定义在函数外部,整个程序都有效
- 踩坑提醒:局部变量如果不初始化,值是随机的 “垃圾值”,一定要养成初始化变量的习惯。
五、算术操作符:+、-、*、/、%
C 语言提供了基本的算术运算:
| + | 加法 | a + b |
| – | 减法 | a – b |
| * | 乘法 | a * b |
| / | 除法 | a / b |
| % | 取模(求余数) | a % b |
重点注意:
六、赋值操作符:= 和复合赋值
1. 基本赋值
= 是赋值操作符,作用是把右边的值赋给左边的变量:
int a = 10;
a = a + 5; // a 变成 15
2. 复合赋值
为了简化代码,C 语言提供了复合赋值操作符:
a += 5; // 等价于 a = a + 5
a -= 3; // 等价于 a = a – 3
a *= 2; // 等价于 a = a * 2
a /= 4; // 等价于 a = a / 4
a %= 2; // 等价于 a = a % 2
七、单目操作符:++、–、+、-
单目操作符只操作一个变量,最常用的是自增 ++ 和自减 –:
1. 前置 ++/–
先自增 / 自减,再参与运算:
int a = 5;
int b = ++a; // a 先变成 6,再赋值给 b → b = 6, a = 6
2. 后置 ++/–
先参与运算,再自增 / 自减:
int a = 5;
int b = a++; // 先把 a=5 赋值给 b,a 再变成 6 → b = 5, a = 6
易错点:++a 和 a++ 的结果完全不同,写循环时要特别注意,避免逻辑错误。
八、强制类型转换
当不同类型的数据参与运算时,C 语言会自动进行类型转换,但有时我们需要手动控制,这就是强制类型转换:
语法:(目标类型) 变量/表达式
double pi = 3.14;
int a = (int)pi; // 强制把 double 转成 int → a = 3,舍去小数
常见场景:
- 把浮点数转成整数(截断小数)
- 把大类型转成小类型(可能丢失精度)
- 避免整数除法的问题:(double)5 / 2 → 结果是 2.5
九、scanf 和 printf 介绍
printf 和 scanf 是我们和程序交互的核心函数:
1. printf(格式化输出)
语法:printf("格式化字符串", 变量列表);
int a = 10;
double b = 3.14;
printf("a = %d, b = %.2f\\n", a, b);
// 输出:a = 10, b = 3.14
常用占位符:
- %d:整型
- %c:字符
- %s:字符串
- %f:浮点数
- %lf:double 类型
2. scanf(格式化输入)
语法:scanf("格式化字符串", &变量列表);
int age;
scanf("%d", &age); // 从键盘读取一个整数,存入 age
注意:scanf 中变量前必须加 &(取地址符),数组名除外。
总结
这一篇我们系统学习了 C 语言的数据类型、变量和基本操作符,这些是编写任何程序的基石。
回想我刚开始学的时候,总是搞不清 signed 和 unsigned 的区别,也经常在 ++ 前置后置上写错逻辑。直到后来自己写代码、写博客,才慢慢把这些细节吃透。
下一篇我们会学习流程控制语句(if/else、for、while),终于可以写出有逻辑、能判断的程序了,一起加油!
持续更新 C 语言学习笔记,欢迎关注点赞收藏~输出才是最好的学习方式。




