1.“记忆盒子”:变量与数据类型
“记忆盒子”:变量与数据类型 (int, double, char, bool)
本章导读 (The Hook)
想象一下,你在玩一款极其刺激的电子游戏。你的角色有多少血量?背包里有多少金币?手里拿的是什么武器?这些信息如果电脑记不住,游戏就根本没法进行。
但正如我们在序章中所说,电脑本身是个“健忘症患者”,断电就忘。为了让它在程序运行期间帮我们记住这些关键信息,我们需要给它提供一些专门用来存放数据的“容器”。
在 C++ 的世界里,这些容器就叫变量 (Variable)。你可以把它们想象成一个个贴着标签的盒子。
- 有的盒子很小,只能装一个字母;
- 有的盒子很结实,专门用来装整数;
- 有的盒子很精密,可以装带小数点的数字。
为了防止装错,C++ 规定:在制造盒子的时候,必须明确规定这个盒子只能装什么类型的东西。 这就是数据类型 (Data Type)。
本章,我们就来学习如何制造这些神奇的“记忆盒子”,让我们的程序拥有记忆力!
专业术语速查表 (Glossary)
点击展开/折叠本章术语表
变量 (Variable)
- 通俗比喻:一个贴了标签的、用来装数据的盒子。盒子里的东西(值)可以随时被拿出来、修改、再放回去。
- 解释:程序中用于存储数据的一个具名的内存空间。其值在程序运行期间可以改变。
数据类型 (Data Type)
- 通俗比喻:盒子的种类或规格。决定了这个盒子能装什么样的数据(是整数、小数还是文字),以及能装多大。
- 解释:定义了变量可以存储的数据种类以及该变量在内存中占用的空间大小。
int(Integer)- 通俗比喻:专门装整数的普通盒子。比如:
1,100,-5,0。 - 解释:整型,通常占用 4 个字节的内存空间,用于存储没有小数部分的数值。
- 通俗比喻:专门装整数的普通盒子。比如:
double- 通俗比喻:专门装小数(双精度浮点数)的精密盒子。比如:
3.14,-0.5,100.0。 - 解释:双精度浮点型,通常占用 8 个字节,用于存储带有小数部分的数值,精度比
float更高。
- 通俗比喻:专门装小数(双精度浮点数)的精密盒子。比如:
char(Character)- 通俗比喻:专门装单个字符的小盒子。比如:
'A','b','1','#'。注意必须用单引号' '包裹。 - 解释:字符型,占用 1 个字节,用于存储单个 ASCII 字符。
- 通俗比喻:专门装单个字符的小盒子。比如:
bool(Boolean)- 通俗比喻:一个神奇的微型盒子,只能装两个东西中的一个:真 (
true) 或 假 (false)。就像一个开关,只有开和关两种状态。 - 解释:布尔型,用于逻辑判断,其值只能是
true(真,通常值为 1) 或false(假,通常值为 0)。
- 通俗比喻:一个神奇的微型盒子,只能装两个东西中的一个:真 (
string- 通俗比喻:专门装一串文字的长盒子。比如:
"Hello World","李华"。注意必须用双引号" "包裹。(注:string不是基本数据类型,而是标准库提供的一个强大的类,但非常常用,我们提前混个脸熟。) - 解释:字符串类型,用于存储文本序列。需要
#include <string>。
- 通俗比喻:专门装一串文字的长盒子。比如:
声明 (Declaration)
- 通俗比喻:告诉工厂“我要造一个什么类型的盒子,给它贴个什么名字的标签”。
- 解释:告诉编译器变量的名称和类型,以便为其分配内存空间。例如:
int age;
初始化 (Initialization)
- 通俗比喻:在造好盒子的第一时间,就往里面放入一个初始值。
- 解释:在声明变量的同时为其赋予一个初始值。例如:
int age = 18;
赋值 (Assignment)
- 通俗比喻:把一个新的值放入已经造好的盒子里,原有的值会被覆盖掉。
- 解释:使用赋值运算符
=将一个值存储到变量中。例如:age = 20;
核心概念讲解 (The Core Concept)
1. 制造盒子:变量的声明与定义
想要用一个盒子,首先得把它造出来。在 C++ 中,造盒子的语法非常简单,遵循 “类型 + 名字” 的格式:
// 语法格式:数据类型 变量名;
int score; // 造一个名叫 score 的盒子,专门用来装整数
double price; // 造一个名叫 price 的盒子,专门用来装小数
char grade; // 造一个名叫 grade 的盒子,专门用来装单个字符重要规则: 盒子一旦造好(声明后),它的类型就不能变了。你不能在一个程序里先说 score 是个装整数的盒子,后来又硬要往里面塞一个小数,编译器会抗议的!
2. 往盒子里放东西:赋值与初始化
盒子造好了,现在它是空的(或者装着随机的垃圾数据,后面会讲到这个大坑)。我们需要往里面放东西。
初始化 (Initialization):在造盒子的同时就放入东西。(强烈推荐的做法!)
int score = 100; // 造一个叫 score 的整数盒子,并立刻放入 100 double price = 9.99; // 造一个小数盒子,放入 9.99 char grade = 'A'; // 造一个字符盒子,放入 'A' bool isPass = true; // 造一个布尔盒子,放入 true (真)赋值 (Assignment):盒子已经存在了,我们把里面的东西换成新的。
score = 95; // 把 score 盒子里的 100 拿走,换成 95 price = 5.5; // 把 price 盒子里的值换成 5.5
代码演示:变量大阅兵
让我们来看一个完整的程序,它展示了四种最基本数据类型的用法。
#include <iostream>
#include <string> // 引入字符串工具箱,虽然本章重点是基本类型,但string太常用了
int main() {
// === 1. 整型 (int) ===
// 用途:记录年龄、数量、得分等没有小数点的数字
int lives = 3; // 玩家初始有 3 条命
std::cout << "Initial lives: " << lives << std::endl;
lives = lives - 1; // 玩家死了一次,命减 1。现在 lives 变成了 2
std::cout << "Lives after death: " << lives << std::endl;
// === 2. 浮点型 (double) ===
// 用途:记录价格、重量、温度、精度要求高的数值
double money = 99.5;
std::cout << "My money: " << money << std::endl;
// === 3. 字符型 (char) ===
// 用途:记录单个字母、数字符号或标点。必须用单引号 ' '!
char rank = 'S';
std::cout << "Current rank: " << rank << std::endl;
// === 4. 布尔型 (bool) ===
// 用途:记录只有两种状态的标记,如是否通关、开关是否打开
bool isGameOver = false; // 游戏还没结束,所以是假 (false)
// 在 C++ 中,直接输出 bool 变量,true 会显示为 1,false 会显示为 0
// 使用 std::boolalpha 可以让它显示为 true/false 单词
std::cout << "Is game over? " << std::boolalpha << isGameOver << std::endl;
return 0;
}运行结果预测
试着在脑海里运行一下上面的代码,它会在屏幕上输出什么?
Initial lives: 3
Lives after death: 2
My money: 99.5
Current rank: S
Is game over? false动手试试 (Try It Yourself!)
请在你的 cpp_test 文件夹中新建一个文件 variable_test.cpp,然后完成以下任务:
自我介绍程序:
- 声明一个
int类型的变量myAge,并初始化为你的年龄。 - 声明一个
char类型的变量myInitial,并初始化为你名字首字母的大写(例如 'L')。 - 声明一个
double类型的变量myHeight,并初始化为你的身高(米,例如 1.75)。 - 使用
std::cout把它们打印出来,格式类似于:I am [Age] years old. My initial is [Initial]. My height is [Height] meters.
- 声明一个
各种类型的尝试:
- 试着把一个小数赋给
int变量,例如int a = 3.9;,然后打印a,看看会发生什么?(答案:C++ 会无情地截断小数部分,只保留整数3,而不会四舍五入!) - 试着把一个超过
char容量的内容赋给它,例如char c = 'AB';,看看编译器会说什么?(答案:编译器会警告或报错,因为char这个小盒子只能装一个字符。)
- 试着把一个小数赋给
“防坑”指南与常见错误 (The Pitfalls)
超级大坑:未初始化的变量
这是新手最容易犯、危害也最大的错误之一!
当你声明一个变量 int score; 但没有给它赋值时,这个“盒子”里并不是空的,而是装着之前留在这个内存位置的垃圾数据!它的值可能是 0,也可能是 -858993460 这样莫名其妙的数字。
int score; // 危险!没有初始化
// 此时如果直接使用 score,可能会得到一个随机的垃圾值,导致程序出现灵异现象。
std::cout << "Score is: " << score << std::endl;最佳实践:永远在声明变量的同时对它进行初始化! 哪怕暂时不知道赋什么值,也要给个默认值(如 0, 0.0, false, '\0')。
int score = 0; // 安全!易错点:单引号 vs 双引号
char类型必须使用单引号' ',且里面只能有一个字符:char c = 'A';- 字符串(后面会细学)必须使用双引号
" ",里面可以有多个字符:string s = "Hello";
千万别混用!'A' 是一个字符,而 "A" 是一个包含了一个字符的字符串,它们在计算机眼里的存储方式完全不同。
变量命名规范
给盒子贴标签(起变量名)也是有讲究的:
- 只能包含字母、数字和下划线
_。 - 不能以数字开头。(
1st_place是错的,place_1st是对的) - 不能是 C++ 的关键字。(你不能给盒子起名叫
int或return) - 区分大小写!
score和Score是两个完全不同的变量。 - 建议:使用有意义的英文单词,采用“小驼峰命名法”(第一个单词首字母小写,后面单词首字母大写),例如
myStudentScore,enemyHealthPoint。
本章小结 (The Summary)
这一章我们学习了编程世界的基石——如何存储数据。请务必牢记以下几点:
- 变量是内存中存储数据的“盒子”。
- 数据类型决定了盒子能装什么:
int: 装整数。double: 装小数。char: 装单个字符(用单引号' ')。bool: 装真/假(true/false)。
- 声明变量时必须指定类型:
类型 变量名; - 初始化是极其重要的好习惯:
类型 变量名 = 初始值; - 给变量起名要遵守规则,最好能做到“见名知意”。
掌握了这些“记忆盒子”,我们的程序就能保存状态了。但现在的程序还只会按部就班地从上到下执行。在未来的章节里,我们将学习如何利用这些变量里的值来做判断,让程序变得“聪明”起来!下一章,我们先来学习如何对这些盒子里的数据进行加工——运算符的世界。
