前言
欢迎来到第三章!
在上一章中,我们认识了一个 C 程序的完整结构:头文件、主函数、语句。但我们写的程序都是 "固定的"—— 输出什么内容在写代码的时候就定死了。
如果我想让程序 "记住" 一些东西呢?比如用户输入的数字、计算的中间结果,这时候就需要变量了。
而变量又有不同的类型—— 有的存整数,有的存小数,有的存字符,为什么要分这么多种类型?每种类型有什么特点?
本章我们就来搞清楚这两个最重要的基础概念:
- 什么是变量?变量怎么用?
- 什么是数据类型?C 语言有哪些基本类型?
这一章是后面所有内容的基础,一定要吃透哦~
一、什么是变量?
1.1 变量的通俗理解
变量,就是一个有名字的 "盒子",用来存放数据。
想象一下:
- 你有一个盒子,上面贴着标签叫
age - 你往盒子里放了一个数字:18
- 后来你又把 18 拿出来,换成了 20
- 这个盒子里的东西是可以变的,所以叫变量
int age = 18; // 造一个叫age的盒子,放进去18 age = 20; // 把盒子里的东西换成201.2 变量的本质:内存
从计算机底层来看,变量本质上就是一块内存空间。
- 内存就像一个大仓库,被分成了一个个小格子
- 每个小格子都有一个地址(门牌号)
- 变量就是给某一块内存空间起了个名字
- 通过这个名字,我们就能读写这块内存里的数据
内存地址: 0x100 0x101 0x102 0x103 ... ┌─────┬─────┬─────┬─────┐ 数据: │ 18 │ │ │ │ ... └─────┴─────┴─────┴─────┘ ↑ 变量age指向这里不过对初学者来说,不用太纠结底层细节,先记住 "变量就是装数据的盒子" 就够了。
1.3 为什么需要变量?
你可能会问:直接写数字不行吗?为什么还要用变量?
因为变量有三大好处:
① 方便修改
// 如果不用变量,想改年龄得改好几个地方 printf("我今年18岁\n"); printf("明年我就19岁了\n"); printf("18岁正是好年纪\n"); // 用变量的话,改一处就行 int age = 18; printf("我今年%d岁\n", age); printf("明年我就%d岁了\n", age + 1); printf("%d岁正是好年纪\n", age);② 保存中间结果
// 计算长方形面积,把结果存起来后面用 int width = 5; int height = 3; int area = width * height; printf("面积是:%d\n", area);③ 接收用户输入
int num; scanf("%d", &num); // 把用户输入的数字存到num变量里简单说:有了变量,程序才能 "记住" 东西,才能 "活" 起来。
二、什么是数据类型?
2.1 为什么要有类型?
你可能又会问:变量就是装数据的盒子,那所有盒子都一样大不行吗?为什么还要分类型?
因为不同的数据,需要的空间大小不一样:
- 一个整数,可能 4 个字节就够了
- 一个小数,可能需要 8 个字节
- 一个字符,1 个字节就够了
如果所有盒子都按最大的做,就会浪费空间。就像你不会用行李箱装一支笔一样 —— 大材小用。
所以 C 语言把数据分成了不同的类型,每种类型:
- 占用的内存大小不同
- 能表示的数值范围不同
- 支持的运算也不同
2.2 C 语言的基本数据类型
C 语言的基本数据类型主要分三大类:
| 类型分类 | 关键字 | 用途 |
|---|---|---|
| 整型 | int、short、long、long long | 存整数(正整数、负整数、零) |
| 字符型 | char | 存单个字符(字母、数字、符号) |
| 浮点型 | float、double、long double | 存小数 |
还有一个特殊的void类型,表示 "什么都没有",后面讲函数的时候会遇到。
下面我们一个一个来讲。
三、整型(整数类型)
3.1 int:最常用的整型
int是最常用的整数类型,全称是 integer(整数)。
int age = 18; // 正整数 int temperature = -5; // 负整数 int zero = 0; // 零int通常占用4 个字节(32 位),能表示的范围大约是:
- -2,147,483,648 到 2,147,483,647
对初学者来说,int基本够用了,平时写代码用int就行。
3.2 其他整型
除了int,还有几种整型,各有不同的大小:
| 类型 | 通常大小 | 位数 | 范围(2 的次方表达) | 范围(数值) | 说明 |
|---|---|---|---|---|---|
short | 2 字节 | 16 位 | -2¹⁵ ~ 2¹⁵ - 1 | -32,768 ~ 32,767 | 短整型 |
int | 4 字节 | 32 位 | -2³¹ ~ 2³¹ - 1 | -2,147,483,648 ~ 2,147,483,647 | 最常用,整型默认 |
long | 4 或 8 字节 | 32 或 64 位 | 至少 -2³¹ ~ 2³¹ - 1 | 至少正负 21 亿 | 长整型,平台相关 |
long long | 8 字节 | 64 位 | -2⁶³ ~ 2⁶³ - 1 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 更长的整型 |
简单记:越往后,能存的数越大,但占用的空间也越多。
💡新手提示:初学阶段你就放心用
int,基本不会出错。等后面遇到 "数字太大装不下" 的情况,再考虑用long long。
3.3 有符号和无符号
默认情况下,整型是有符号的 —— 既能存正数,也能存负数。
如果你确定只存非负数(0 和正整数),可以加unsigned关键字,变成无符号整型:
unsigned int age = 18; // 无符号整型,只能存0和正数无符号的好处是:正数范围更大了(因为不用给负数留位置了)。
比如unsigned int的范围就是0 到 4,294,967,295。
四、字符型(char)
4.1 char:存单个字符
char是字符类型,用来存单个字符—— 比如一个字母、一个数字、一个符号。
char grade = 'A'; // 大写字母 char ch = 'a'; // 小写字母 char digit = '5'; // 数字字符(注意和数字5不一样!) char symbol = '@'; // 符号⚠️注意:字符要用单引号' '包起来,不是双引号!
'A'是一个字符
"A" 是一个字符串(后面会讲)
4.2 char 的本质:ASCII 码
虽然char叫 "字符型",但它本质上也是一个整数 —— 每个字符对应一个数字编号,这就是ASCII 码。
所以char其实就是一个比较小的整型,通常占1 个字节,范围是 -128 ~ 127。
你甚至可以把它当整数用:
char c = 'A'; printf("%c\n", c); // 输出字符:A printf("%d\n", c); // 输出ASCII码:65运行结果:
A 65很神奇吧?字符和数字在底层是相通的。
💡小技巧:小写字母比对应的大写字母大 32。比如 '
a'-'A'= 32。记住这个,后面写大小写转换的代码会用到。
五、浮点型(小数类型)
5.1 float 和 double
浮点型就是用来存小数的,也叫实数类型。
C 语言有三种浮点型:
表格
| 类型 | 通常大小 | 精度 | 说明 |
|---|---|---|---|
float | 4 字节 | 约 6~7 位有效数字 | 单精度浮点 |
double | 8 字节 | 约 15~16 位有效数字 | 双精度浮点,最常用 |
long double | 8 或 16 字节 | 更高精度 | 长双精度,很少用 |
简单说:double比float更精确,占用空间也更大。
5.2 怎么用?
float pi = 3.14f; // float类型,后面加个f double height = 1.75; // double类型,最常用💡新手提示:写小数的时候,默认是
double类型。如果要表示float,后面要加f或F。初学阶段建议直接用double,精度高,也不用纠结后缀。
5.3 输出浮点型
输出浮点型用%f格式控制符:
double pi = 3.1415926; printf("π = %f\n", pi);输出:
π = 3.141593默认会输出 6 位小数。如果想控制小数位数,可以这样写:
printf("π = %.2f\n", pi); // 保留2位小数 printf("π = %.4f\n", pi); // 保留4位小数输出:
π = 3.14 π = 3.1416⚠️注意:浮点数有精度问题,不能精确表示所有小数。比如 0.1 在二进制里是无限循环小数,存的时候会有微小误差。初学阶段不用太纠结,知道有这回事就行。
六、变量的声明和使用
6.1 如何声明变量
使用变量之前,必须先声明(也叫定义)。
声明变量的语法:
类型名 变量名;比如:
int age; // 声明一个int类型的变量,叫age double height; // 声明一个double类型的变量,叫height char grade; // 声明一个char类型的变量,叫grade声明变量的意思就是:"我要一个盒子,类型是 XX,名字叫 XX。"
6.2 初始化
声明变量的时候,可以直接给它赋值,这叫初始化:
int age = 18; // 声明的同时初始化 double pi = 3.14; // 声明的同时初始化 char c = 'A'; // 声明的同时初始化也可以先声明,后赋值:
int age; // 先声明 age = 18; // 后赋值⚠️重要提醒:局部变量如果不初始化,里面的值是随机的、不确定的!千万不要直接用未初始化的变量,否则结果会很奇怪。一定要养成 "声明就初始化" 的好习惯。
6.3 变量命名规则
给变量起名字要遵守几个规则:
✅可以用:
- 字母(a-z, A-Z)
- 数字(0-9)
- 下划线(_)
❌不能用:
- 不能以数字开头
- 不能有空格、加减乘除等特殊符号
- 不能是 C 语言的关键字(比如
int、if、for这些)
另外,C 语言区分大小写,age和Age是两个不同的变量。
6.4 命名建议
语法是底线,更重要的是起一个好名字:
✅好的命名:
int age; // 年龄 int student_age; // 学生年龄 double price; // 价格 char grade; // 等级❌不好的命名:
int a; // 鬼知道a是什么 int nianling; // 用拼音?不专业 int sAge; // 什么意思? int _123; // 虽然合法,但看不懂💡经验之谈:好的变量名应该 "见名知意"—— 别人一看名字就知道这个变量是干什么的。命名是程序员的基本功,从第一天开始就要养成好习惯。
七、综合示例
学了这么多,让我们来看一个完整的例子,把变量和类型都用起来:
#include <stdio.h> int main() { // 声明各种类型的变量并初始化 int age = 18; char grade = 'A'; double height = 1.75; float weight = 65.5f; // 输出各个变量的值 printf("年龄:%d岁\n", age); printf("等级:%c\n", grade); printf("身高:%.2f米\n", height); printf("体重:%.1f公斤\n", weight); // 修改变量的值 age = age + 1; // 年龄加1 printf("明年我就%d岁了\n", age); return 0; }运行结果:
年龄:18岁 等级:A 身高:1.75米 体重:65.5公斤 明年我就19岁了每一行的作用都看懂了吗?
⚠️ 关于本文
由于笔者水平有限,文中难免存在疏漏、错误或表述不够准确的地方。如果你在阅读过程中发现了任何问题 —— 无论是概念错误、代码 bug、还是表述不清 —— 都欢迎在评论区留言指正,我会及时修正。
技术之路,道阻且长,行则将至。我们互相学习,共同进步 💪