C++: 变量与基本数据类型
最后更新:2026-08-26
第02课我们搭好了开发环境,能编译运行程序了。
但程序不能只输出固定的话,它得能记住东西、处理数据。这就需要变量。
就像做数学题,你得先设 x、y、z,程序里也得先"设"变量,才能存数据。
1. 什么是变量?
(1) 1.1 生活中的变量
| 生活场景 | 程序中的对应 |
|---|---|
| 你有一个名字,但 age 每年都变 | 变量:值可以改变 |
| 你有一个身份证号,终身不变 | 常量:值不能改变 |
| 你有一个杯子,可以装水也可以装可乐 | 变量:类型固定(杯子),值可变(装的东西) |
变量就是内存中的一个"盒子",你可以往里面放东西(赋值),也可以把东西拿出来用(读取)。
(2) 1.2 为什么需要变量?
没有变量,程序只能做"死"的事情:
// 没有变量,只能输出固定的话
std::cout << "Hello, World!" << std::endl;
有了变量,程序才能"活"起来:
// 有了变量,可以记住用户的输入
std::string name;
std::cin >> name;
std::cout << "Hello, " << name << "!" << std::endl;
2. 基本数据类型
C++ 是静态类型语言——每个变量都必须先声明类型,而且类型不能改。
(1) 2.1 五种基本数据类型
| 类型 | 关键字 | 占用空间 | 范围 | 生活类比 |
|---|---|---|---|---|
| 整数 | int |
4 字节 | -2,147,483,648 ~ 2,147,483,647 | 人数、年龄、年份 |
| 浮点数 | double |
8 字节 | 约 ±1.7 × 10³⁰⁸ | 身高、体重、价格 |
| 字符 | char |
1 字节 | -128 ~ 127(或 0 ~ 255) | 单个字母、等级(A/B/C) |
| 布尔 | bool |
1 字节 | true 或 false |
是否通过、是否成年 |
| 字符串 | string |
可变 | 任意长度 | 名字、地址、一段话 |
💡 提示: string 不是 C++ 的"基本类型",而是标准库提供的类型。使用前需要 #include <string>。
(2) 2.2 声明变量
语法:
Type variableName;
示例:
int age; // 声明一个整数变量,名叫 age
double price; // 声明一个浮点数变量,名叫 price
char grade; // 声明一个字符变量,名叫 grade
bool isPassed; // 声明一个布尔变量,名叫 isPassed
std::string name; // 声明一个字符串变量,名叫 name
(3) 2.3 声明的同时赋值(初始化)
语法:
Type variableName = value;
示例:
int age = 25; // 声明 age,并赋值为 25
double price = 19.99; // 声明 price,并赋值为 19.99
char grade = 'A'; // 声明 grade,并赋值为 'A'(注意:字符用单引号)
bool isPassed = true; // 声明 isPassed,并赋值为 true
std::string name = "MOTO"; // 声明 name,并赋值为 "MOTO"(注意:字符串用双引号)
💡 提示: C++11 引入了更现代的初始化方式(统一初始化):
int age = {25}; // 统一初始化(推荐)
double price{19.99}; // 可以省略等号(推荐)
这种方式可以防止窄化转换(比如把 3.14 赋给 int 会报错,而不是偷偷截断)。
3. 变量的使用
▶ 示例 1:计算圆的面积(难度⭐)
#include <iostream>
int main() {
const double PI = 3.14159; // 常量(后面会讲)
double radius;
std::cout << "请输入圆的半径:";
std::cin >> radius;
double area = PI * radius * radius;
std::cout << "圆的面积是:" << area << std::endl;
return 0;
}
输出:
请输入圆的半径:
圆的面积是:
运行效果:
请输入圆的半径:5
圆的面积是:78.5397
代码解析:
const double PI = 3.14159;— 声明一个常量 PI,值不能改double radius;— 声明一个浮点数变量 radiusstd::cin >> radius;— 从键盘读取用户输入,存入 radiusdouble area = PI * radius * radius;— 计算面积,结果存入 areastd::cout << ...— 输出结果
4. 变量命名规则
C++ 对变量名有严格规定:
(1) 4.1 硬性规则(必须遵守)
| 规则 | 正确示例 | 错误示例 |
|---|---|---|
| 只能包含字母、数字、下划线 | my_age, score2 |
my-age(不能有减号) |
| 不能以数字开头 | age2 |
2age |
| 区分大小写 | age 和 Age 是两个不同的变量 |
— |
| 不能是关键字 | int myInt = 5; |
int int = 5;(int 是关键字) |
C++ 关键字列表(部分):
int, double, char, bool, string, if, else, for, while,
return, class, public, private, new, delete, ...
(2) 4.2 软性规则(强烈推荐)
虽然编译器不强制,但遵守这些规则会让你的代码更易读:
| 规则 | 推荐风格 | 不推荐风格 |
|---|---|---|
| 变量名要有意义 | studentAge |
a, x1 |
| 多个单词用驼峰命名法 | studentAge, totalScore |
student_age, total_score |
| 常量全大写 | const int MAX_SIZE = 100; |
const int maxSize = 100; |
💡 提示: 不同团队可能有不同的命名规范。本教程使用驼峰命名法(camelCase)。
5. 常量(const)
有些值是不应该被改变的,比如圆周率 π、一年有多少天、数组的最大长度。
(1) 5.1 为什么需要常量?
不用常量(坏例子):
double circumference = 3.14159 * diameter; // 这里的 3.14159 是"魔法数字"
double area = 3.14159 * radius * radius; // 如果 π 写错了,要改两处
用常量(好例子):
const double PI = 3.14159;
double circumference = PI * diameter; // 清晰、好改
double area = PI * radius * radius;
(2) 5.2 如何声明常量?
语法:
const Type CONST_NAME = value;
示例:
const int DAYS_PER_WEEK = 7;
const double PI = 3.14159;
const std::string SCHOOL_NAME = "美珈职业学院";
💡 提示: 常量名通常全大写,用下划线分隔单词,这是 C++ 的传统。
(3) 5.3 常量的特点
- 必须初始化(声明时就要赋值)
const int MAX_SIZE; // ❌ 错误:常量必须初始化
- 不能修改
const int MAX_SIZE = 100;
MAX_SIZE = 200; // ❌ 错误:不能修改常量的值
6. 输入和输出(cin 和 cout 进阶)
(1) 6.1 一次输入多个变量
cin 可以一次读取多个变量,用空格或回车分隔:
#include <iostream>
#include <string>
int main() {
int age;
std::string name;
std::cout << "请输入你的名字和年龄(用空格隔开):";
std::cin >> name >> age; // 一次读取两个变量
std::cout << "你好," << name << "!你今年 " << age << " 岁。" << std::endl;
return 0;
}
运行效果:
请输入你的名字和年龄(用空格隔开):MOTO 35
你好,MOTO!你今年 35 岁。
(2) 6.2 混合使用 cin 和 cout
#include <iostream>
#include <string>
int main() {
std::string name;
int age;
double height;
std::cout << "请输入你的名字:";
std::cin >> name;
std::cout << "请输入你的年龄:";
std::cin >> age;
std::cout << "请输入你的身高(米):";
std::cin >> height;
std::cout << "========== 个人信息 ==========" << std::endl;
std::cout << "名字:" << name << std::endl;
std::cout << "年龄:" << age << " 岁" << std::endl;
std::cout << "身高:" << height << " 米" << std::endl;
return 0;
}
7. 常见错误与调试
(1) 7.1 忘记初始化变量
错误示例:
#include <iostream>
int main() {
int x; // 声明了 x,但没有赋值
std::cout << x << std::endl; // ❌ x 的值是"垃圾值",不确定
return 0;
}
正确做法:
int x = 0; // 声明时就初始化
std::cout << x << std::endl; // ✅ 输出 0
💡 提示: 现代 C++ 编译器会警告你使用未初始化的变量,但不要依赖编译器,要养成初始化的好习惯。
(2) 7.2 类型不匹配
错误示例:
int age;
std::cin >> age;
// 如果用户输入 "abc",age 会保持不变(或更糟)
正确做法(后面会学如何检查输入是否合法):
int age;
std::cin >> age;
if (std::cin.fail()) {
std::cout << "输入错误!请输入一个数字。" << std::endl;
}
(这个知识点到第08课会详细讲,现在先知道有这个问题。)
8. 实战:简单计算器
▶ 示例 2:加减乘除计算器(难度⭐⭐)
#include <iostream>
int main() {
double num1, num2;
char op;
std::cout << "请输入第一个数字:";
std::cin >> num1;
std::cout << "请输入运算符(+ - * /):";
std::cin >> op;
std::cout << "请输入第二个数字:";
std::cin >> num2;
double result;
if (op == '+') {
result = num1 + num2;
} else if (op == '-') {
result = num1 - num2;
} else if (op == '*') {
result = num1 * num2;
} else if (op == '/') {
if (num2 != 0) {
result = num1 / num2;
} else {
std::cout << "错误:除数不能为 0!" << std::endl;
return 1; // 非正常退出
}
} else {
std::cout << "错误:不支持的运算符!" << std::endl;
return 1;
}
std::cout << "结果:" << num1 << " " << op << " " << num2 << " = " << result << std::endl;
return 0;
}
输出:
请输入第一个数字:
请输入运算符(+ - * /):
请输入第二个数字:
错误:除数不能为 0!
错误:不支持的运算符!
结果: =
运行效果:
请输入第一个数字:10
请输入运算符(+ - * /):*
请输入第二个数字:5
结果:10 * 5 = 50
💡 提示: 这个程序用到了 if-else(第06课会详细讲),你可以先照抄,理解大概思路。
❓ 常见问题
int 存整数(如 25、-3),double 存浮点数(如 19.99、3.14)。经验法则:计数/年龄/年份→int;价格/身高/平均成绩→double。char 是单个字符,用单引号(如 'A');string 是多个字符,用双引号(如 "Hello")。注意 "A" 和 'A' 是完全不同的类型。const 是 C++ 关键字,有类型检查更安全,推荐使用(如 const double PI = 3.14159;)。#define 是 C 风格的宏定义,没有类型检查,不推荐。int 年龄 = 25; 这样的代码。▶ 示例 3:类型转换(难度⭐)
#include <iostream>
int main() {
int a = 5;
double b = 3.7;
// 隐式转换
double c = a + b;
std::cout << "隐式转换:" << c << std::endl;
// 显式转换(C风格)
int d = (int)b;
std::cout << "C风格转换:" << d << std::endl;
// C++风格转换
int e = static_cast<int>(b);
std::cout << "C++风格转换:" << e << std::endl;
return 0;
}
输出:
隐式转换:
C风格转换:
C++风格转换:
static_cast<T>() 是C++推荐的类型转换方式,比C风格的 (T) 更安全。
- 变量是内存中的"盒子",用来存数据
- C++ 有 5 种基本数据类型:
int、double、char、bool、string - 声明变量:
类型 变量名; - 初始化变量:
类型 变量名 = 值;(推荐用统一初始化类型 变量名{值};) - 常量用
const声明,值不能改,必须初始化 - 输入用
cin,输出用cout - 变量命名要有意义,遵守规则
📖 小节
- 基本类型:int、double、char、bool
- 类型转换:static_cast、dynamic_cast
- auto:自动类型推导
- const:常量,不可修改
📝 作业
- 基础题 (Difficulty ⭐):
编写一个程序,声明三个变量:
name(字符串)、age(整数)、score(浮点数),分别赋值并输出。
我叫 Alice,今年 20 岁,期末成绩 92.5 分。
-
进阶题 (Difficulty ⭐⭐): 编写一个程序,让用户输入圆的半径,计算并输出圆的周长和面积(周长 = 2πr,面积 = πr²)。
-
用常量定义 π(3.14159)
-
输出保留 2 位小数(提示:用
std::fixed和std::setprecision,需要#include <iomanip>) -
挑战题 (Difficulty ⭐⭐⭐): 编写一个程序,实现"华氏温度转摄氏温度":
-
让用户输入华氏温度
-
用公式 C = (F - 32) × 5/9 计算摄氏温度
-
输出结果(保留 1 位小数)
-
示例:输入 68,输出"68°F = 20.0°C"
- 变量是内存中的数据存储单元,必须先声明后使用
- C++ 基本类型:int(整数)、double(浮点)、char(字符)、bool(布尔)、string(字符串)
- 变量初始化方式:= 赋值 / 统一初始化 {}
- 常量用 const 声明,值不可修改且必须初始化
- 命名规则:字母/数字/下划线,数字不能开头,区分大小写
9. 🚀 下一步
学会了变量和数据类型,接下来我们学习 C++ 的运算符(第04课)—— 让变量之间能做加减乘除、比较大小、逻辑判断。