C语言入门教程(第2讲):数据类型与变量详解与实战讲解
🌱 文章摘要
当你写下第一个“printf”后,程序会“说话”;
当你学会变量与类型后,程序终于有了“记忆”。
这一讲,我们将深入C语言的数据世界,
理解整型、浮点型、字符型的底层逻辑,
掌握输入输出、类型转换与溢出问题的正确写法。你会通过一个个实例和输出结果,
看到C语言如何在内存中“记住”和“处理”信息。
不再只是抄代码,而是理解了——代码为什么能运行。这是《C语言入门教程》的第二讲,
带你从“写代码的人”,成长为“懂代码的人”。
💬 导读
本篇是《C语言入门教程》系列的第二讲。
在上一讲中,你学会了如何写出第一个程序,理解了 main 函数与 printf 的基础规则。
而从这一讲开始,你将进入C语言的核心:变量与数据类型。我们将从整型、浮点型、字符型讲起,学习它们在内存中的表示方式;
然后通过实战掌握printf
与scanf
的用法;
最后带你理解类型转换与溢出的根本原因。
🧭 本讲属于「C语言基础篇」,
建议搭配阅读第1讲C语言入门教程(第1讲):最通俗的C语言常见概念详解与实战讲解-CSDN博客
形成“从认识语言到理解数据”的完整学习链条。
✨ 建议边看边写,每一段代码都亲手运行一次。
当你能让程序“存数据”“算结果”,就算真正入门了。
📘 建议收藏本专栏:后续章节会持续更新,
包括控制语句、函数、指针、数组、文件操作等完整体系。如果你能坚持学完,你会发现——
C语言不仅是工具,更是理解计算机世界的第一扇门。
目录
一、数据与变量的基本概念
二、数据类型的分类
三、整型类型详解
四、浮点型与精度问题
五、字符型与ASCII存储
六、常量与变量的区别
6.1 变量(Variable)
6.2 常量(Constant)
七、变量的作用域与生命周期
7.1 局部变量
7.2 全局变量
八、输入输出:scanf 与 printf 实战
8.1 示例1:输入年龄并输出
8.2 示例2:计算矩形面积
九、类型转换与溢出问题
9.1 自动类型转换(隐式转换)
9.2 强制类型转换(显式转换)
9.3 溢出问题
十、小练习:摄氏温度与华氏温度转换
十一、总结
十二、下一讲预告
12.1 下一讲预告
12.2 提前准备建议
一、数据与变量的基本概念
在第1讲中,我们使用
printf("hello C");
输出了固定内容。
但如果你想让程序根据输入计算结果,就必须让程序“记住”数据。
——这正是变量的意义。
你可以把变量想成计算机内存中的“储物盒”,
每个盒子都有一个名字(变量名)和一种规格(数据类型)。
int age = 18; printf("我的年龄是:%d\n", age);
输出:
我的年龄是:18
输出解读:
int
表示变量类型为整数;%d
是输出格式控制符,用于打印整型;- 变量的值可以修改,也可以重新赋值。
易错提醒:
C语言的变量必须先声明类型再使用,否则会报错。
变量是程序与内存沟通的桥梁。
理解变量,就是迈出理解计算机思维的第一步。
二、数据类型的分类
C语言是一种强类型语言,每个变量都必须声明数据类型。
不同类型决定了内存占用与数值范围。
分类 | 关键字 | 举例 | 说明 |
---|---|---|---|
整型 | int, short, long | 10, -25 | 表示整数 |
浮点型 | float, double | 3.14, -2.5 | 表示小数 |
字符型 | char | 'A', 'b' | 表示单个字符 |
其他 | void, _Bool, enum | - | 特殊用途 |
数据类型 说明 32位系统(字节) 64位系统(字节) 典型取值范围 char
字符型 1 1 -128 ~ 127 或 0 ~ 255 unsigned char
无符号字符型 1 1 0 ~ 255 short
短整型 2 2 -32,768 ~ 32,767 unsigned short
无符号短整型 2 2 0 ~ 65,535 int
整型 4 4 -2,147,483,648 ~ 2,147,483,647 unsigned int
无符号整型 4 4 0 ~ 4,294,967,295 long
长整型 4 8 依平台而定(LP32 vs LP64) unsigned long
无符号长整型 4 8 依平台而定 long long
长长整型 8 8 ±9,223,372,036,854,775,807 unsigned long long
无符号长长整型 8 8 0 ~ 18,446,744,073,709,551,615 float
单精度浮点型 4 4 约 ±3.4E38(6~7 位有效数字) double
双精度浮点型 8 8 约 ±1.7E308(15~16 位有效数字) long double
扩展精度浮点型 12 或 16 16 约 ±1.1E4932(19~20 位有效数字) void *
指针类型(任意类型指针) 4 8 存储内存地址
32位系统:
单位:1个 █ = 1字节char █
unsigned char █
short ██
unsigned short ██
int ████
unsigned int ████
long ████
unsigned long ████
long long ████████
unsigned long long ████████
float ████
double ████████
long double ████████████
void * ████
//////////////////////////////////////////////////////////
64位系统:
单位:1个 █ = 1字节char █
unsigned char █
short ██
unsigned short ██
int ████
unsigned int ████
long ████████
unsigned long ████████
long long ████████
unsigned long long ████████
float ████
double ████████
long double ████████████
void * ████████
理解重点:
- 内存是有限的资源,类型的设计是为了节省内存与提升效率;
- 同一个值,不同类型的存储方式与范围都不同。
数据类型定义了程序“能处理什么样的数据”。
理解类型,就是理解计算机的“语言单位”。
三、整型类型详解
整型用于表示没有小数部分的数字。
类型 | 字节数 | 范围(典型) |
---|---|---|
short | 2 | -32,768 ~ 32,767 |
int | 4 | -2,147,483,648 ~ 2,147,483,647 |
long | 4或8 | 平台相关 |
unsigned int | 4 | 0 ~ 4,294,967,295 |
示例:
#include <stdio.h> int main() {short a = 10;int b = 100;unsigned int c = 4000000000U;printf("a=%d, b=%d, c=%u\n", a, b, c);return 0; }
输出:
a=10, b=100, c=4000000000
输出解读:
%d
用于输出有符号整型;%u
用于输出无符号整型;- 后缀
U
表示常量为 unsigned。
易错提醒:
若类型声明不匹配(如
%d
打印 unsigned int),结果可能异常。
整型是最常用的类型之一,在编写循环、计数器和索引时几乎都会使用它。
四、浮点型与精度问题
浮点型用于存储带小数的数值。
C语言提供两种主要浮点类型:
类型 | 字节 | 精度 | 示例 |
---|---|---|---|
float | 4 | 约6~7位有效数字 | 3.14f |
double | 8 | 约15~16位有效数字 | 3.1415926 |
示例:
#include <stdio.h> int main() {float f = 3.14f;double d = 3.14159265358979;printf("float型:%.8f\n", f);printf("double型:%.15lf\n", d);return 0; }
输出:
float型:3.14000010 double型:3.141592653589790
解读:
- 浮点数存在精度误差;
float
占空间小但误差大;double
精度更高。
易错提醒:
不要用
==
判断两个浮点数是否相等。应该判断它们的差值是否足够小。
浮点型让C语言能处理连续数值,是计算平均值、温度、坐标等应用的基础。
五、字符型与ASCII存储
字符类型 char
本质上是一种特殊的整型,占用 1 个字节。
它存储的是字符的 ASCII 编码值。
示例:
#include <stdio.h> int main() {char ch = 'A';printf("字符:%c\n", ch);printf("ASCII值:%d\n", ch);return 0; }
输出:
字符:A ASCII值:65
解读:
'A'
实际上等价于整数 65;- 你也可以直接打印数字对应的字符:
printf("%c\n", 97); // 输出 a
易错提醒:
'A'
是字符常量,"A"
是字符串。两者不能混用。
字符型是数值型的一个特殊形式。
理解 char
的底层存储方式,有助于理解字符串与指针的本质。
六、常量与变量的区别
在C语言中,所有数据都要有名字,但分为 变量 与 常量。
6.1 变量(Variable)
值可以变化。
int count = 5;
count = 10; // 正确!合法
6.2 常量(Constant)
值在程序运行期间不能修改。
const float PI = 3.14159;
#define MAX 100
区别总结:
类型 | 定义方式 | 是否可修改 | 用途 |
---|---|---|---|
变量 | int a=10; | 是 | 动态数据 |
常量 | const int a=10; | 否 | 固定值、配置项 |
易错提醒:
不要试图修改
const
常量,否则编译器报错。
常量保证程序逻辑安全、可读性高。
“能用常量就不用变量”,是编写健壮C代码的重要习惯。
七、变量的作用域与生命周期
变量并不是在整个程序中都有效,它有自己的“范围”。
7.1 局部变量
定义在函数内部,只能在函数中使用。
void test() {int x = 10; // 局部变量
}
7.2 全局变量
定义在所有函数外部,可以被所有函数访问。
int g = 100; // 全局变量
生命周期解释:
- 局部变量:在函数执行时创建,函数结束后销毁;
- 全局变量:程序启动时创建,直到结束时销毁。
合理使用作用域是防止变量冲突的关键。
局部变量让代码更安全,全局变量让数据更共享。
八、输入输出:scanf
与 printf
实战
第1讲我们只用 printf
输出。
现在,我们要让程序“与用户交互”。
8.1 示例1:输入年龄并输出
#include <stdio.h> int main() {int age;printf("请输入你的年龄:");scanf("%d", &age);printf("你今年%d岁。\n", age);return 0; }
输出示例:
请输入你的年龄:20 你今年20岁。
解读:
scanf
从键盘读取输入;%d
表示读取整数;&
表示“取变量地址”,告诉程序输入放哪。
易错提醒:
千万不要忘记
&
符号,否则会导致程序崩溃。
8.2 示例2:计算矩形面积
#include <stdio.h> int main() {float width, height;printf("请输入矩形的宽和高:");scanf("%f %f", &width, &height);float area = width * height;printf("矩形的面积是:%.2f\n", area);return 0; }
输入:
3.5 2.0
输出:
矩形的面积是:7.00
输入输出是人机交互的第一步。
熟练掌握 printf
与 scanf
,就能做出完整的输入计算输出程序。
九、类型转换与溢出问题
在C语言中,不同类型参与运算时,系统会自动进行类型转换。
9.1 自动类型转换(隐式转换)
int a = 3;
float b = 2.5;
float c = a + b;
printf("%.2f\n", c);
输出:
5.50
解读:
a
自动变成 float 再参与运算。
9.2 强制类型转换(显式转换)
int a = 5, b = 2;
float result = (float)a / b;
printf("结果:%.2f\n", result);
输出:
结果:2.50
易错提醒:
若不加
(float)
,结果将是 2.00,因为是整除。
9.3 溢出问题
#include <stdio.h> int main() {char c = 128;printf("%d\n", c);return 0; }
输出:
-128
解释:
char
范围是 -128~127。
赋值 128 会发生溢出,导致符号位翻转。
理解类型转换与溢出,是避免C语言“隐性错误”的关键。
十、小练习:摄氏温度与华氏温度转换
#include <stdio.h>
int main() {float celsius, fahrenheit;printf("请输入摄氏温度:");scanf("%f", &celsius);fahrenheit = celsius * 9 / 5 + 32;printf("对应的华氏温度是:%.2f\n", fahrenheit);return 0;
}
运行结果:
请输入摄氏温度:37
对应的华氏温度是:98.60
延伸思考:
修改程序,让它循环多次输入温度并自动输出结果。
十一、总结
这一讲,我们正式踏入了C语言的“数据世界”。
从这一刻起,你的程序不再只是输出几行文字,
而是能记住数字、计算结果、保存信息。你已经学会了:
- C语言中的基本数据类型(整型、浮点型、字符型)
- 常量与变量的区别与定义方式
- printf与scanf的输入输出技巧
- 类型转换的原理与溢出的陷阱
- 如何在代码中用变量承载数据、执行计算
这些知识是C语言的“地基”。
有了它,你的程序才真正“有了记忆”,
能接受输入、进行计算、输出结果。
此刻的你,已经具备了用C语言描述现实问题的能力。
从“写出一个程序”,到“让程序理解数据”,
你完成了学习C语言的第二个重要阶段。
而接下来,我们将让程序进一步“思考”。
下一讲,我们会学习 分支与循环 ——
让程序能够判断条件、执行选择、进行重复操作。
那将是C语言逻辑控制的起点,
也是你真正开始“掌控程序流程”的关键一步。
十二、下一讲预告
12.1 下一讲预告
《C语言入门教程(第3讲):分支与循环(上)》
在编程世界中,逻辑决定了一切。
掌握了变量与数据之后,程序能“记住”信息,但如果想让程序根据条件作出判断、反复执行,
就必须学习——分支与循环结构。
这一讲,我们将进入C语言最重要的逻辑控制部分,
让程序真正“动”起来、有思考、有判断。
主要内容包括:
if 与 else 的条件判断
多重条件与嵌套结构
三目运算符(?:)的用法与易错点
while、for、do-while 的区别与执行原理
break 与 continue 的作用场景
程序流程控制图解
实战案例:
判断成绩等级
输出九九乘法表
通过下一讲的学习,你将理解程序的执行逻辑,掌握条件判断与循环控制的核心技巧,
让你的C语言程序具备真正的“智能”与“节奏”。
12.2 提前准备建议
建议你提前在 VS2022 中创建一个新的控制台项目,
并亲手尝试以下几个小练习:
- 使用
if
语句判断一个输入的数字是正数、负数还是零;- 用
for
循环输出 1~10 的所有整数;- 尝试使用
while
循环计算 1 到 100 的累加和;- 在每个程序中加入
printf
输出,观察执行流程。这些练习能帮助你提前理解 条件判断与循环控制 的基本逻辑,
也能让你在阅读第 3 讲时,更轻松地掌握“程序如何根据条件做出不同反应”。
❤️ 系列更新提示
本文为《C语言入门教程》系列第 2 讲
下一讲将带你正式进入C语言的“逻辑世界”点赞 + 收藏 + 关注专栏,别错过更新
你的支持,是我持续更新的最大动力 💪