C++: 变量与基本数据类型

最后更新:2026-08-26

第02课我们搭好了开发环境,能编译运行程序了。

但程序不能只输出固定的话,它得能记住东西处理数据。这就需要变量

就像做数学题,你得先设 x、y、z,程序里也得先"设"变量,才能存数据。


1. 什么是变量?

(1) 1.1 生活中的变量

生活场景 程序中的对应
你有一个名字,但 age 每年都变 变量:值可以改变
你有一个身份证号,终身不变 常量:值不能改变
你有一个杯子,可以装水也可以装可乐 变量:类型固定(杯子),值可变(装的东西)

变量就是内存中的一个"盒子",你可以往里面放东西(赋值),也可以把东西拿出来用(读取)。

(2) 1.2 为什么需要变量?

没有变量,程序只能做"死"的事情:

CPP
// 没有变量,只能输出固定的话
std::cout << "Hello, World!" << std::endl;

有了变量,程序才能"活"起来:

CPP
// 有了变量,可以记住用户的输入
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 字节 truefalse 是否通过、是否成年
字符串 string 可变 任意长度 名字、地址、一段话

💡 提示: string 不是 C++ 的"基本类型",而是标准库提供的类型。使用前需要 #include <string>

(2) 2.2 声明变量

语法:

TEXT 📖 仅展示
Type variableName;

示例:

CPP
int age; // 声明一个整数变量,名叫 age
double price; // 声明一个浮点数变量,名叫 price
char grade; // 声明一个字符变量,名叫 grade
bool isPassed; // 声明一个布尔变量,名叫 isPassed
std::string name; // 声明一个字符串变量,名叫 name

(3) 2.3 声明的同时赋值(初始化)

语法:

TEXT 📖 仅展示
Type variableName = value;

示例:

CPP
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 引入了更现代的初始化方式(统一初始化):

CPP
int age = {25}; // 统一初始化(推荐)
double price{19.99}; // 可以省略等号(推荐)

这种方式可以防止窄化转换(比如把 3.14 赋给 int 会报错,而不是偷偷截断)。



3. 变量的使用

▶ 示例 1:计算圆的面积(难度⭐)

CPP
#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;
}
▶ 试一试

输出:

TEXT 📖 仅展示
请输入圆的半径:
圆的面积是:

运行效果:

TEXT 📖 仅展示
请输入圆的半径:5
圆的面积是:78.5397

代码解析:

  1. const double PI = 3.14159; — 声明一个常量 PI,值不能改
  2. double radius; — 声明一个浮点数变量 radius
  3. std::cin >> radius; — 从键盘读取用户输入,存入 radius
  4. double area = PI * radius * radius; — 计算面积,结果存入 area
  5. std::cout << ... — 输出结果


4. 变量命名规则

C++ 对变量名有严格规定:

(1) 4.1 硬性规则(必须遵守)

规则 正确示例 错误示例
只能包含字母、数字、下划线 my_age, score2 my-age(不能有减号)
不能以数字开头 age2 2age
区分大小写 ageAge 是两个不同的变量
不能是关键字 int myInt = 5; int int = 5;(int 是关键字)

C++ 关键字列表(部分):

CPP
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 为什么需要常量?

不用常量(坏例子):

CPP
double circumference = 3.14159 * diameter; // 这里的 3.14159 是"魔法数字"
double area = 3.14159 * radius * radius; // 如果 π 写错了,要改两处

用常量(好例子):

CPP
const double PI = 3.14159;
double circumference = PI * diameter; // 清晰、好改
double area = PI * radius * radius;

(2) 5.2 如何声明常量?

语法:

CPP
const Type CONST_NAME = value;

示例:

CPP
const int DAYS_PER_WEEK = 7;
const double PI = 3.14159;
const std::string SCHOOL_NAME = "美珈职业学院";

💡 提示: 常量名通常全大写,用下划线分隔单词,这是 C++ 的传统。

(3) 5.3 常量的特点

  1. 必须初始化(声明时就要赋值)
CPP
const int MAX_SIZE; // ❌ 错误:常量必须初始化
  1. 不能修改
CPP
const int MAX_SIZE = 100;
MAX_SIZE = 200; // ❌ 错误:不能修改常量的值


6. 输入和输出(cin 和 cout 进阶)

(1) 6.1 一次输入多个变量

cin 可以一次读取多个变量,用空格或回车分隔:

CPP
#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;
}

运行效果:

TEXT 📖 仅展示
请输入你的名字和年龄(用空格隔开):MOTO 35
你好,MOTO!你今年 35 岁。

(2) 6.2 混合使用 cin 和 cout

CPP
#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 忘记初始化变量

错误示例:

CPP
#include <iostream>

int main() {
 int x; // 声明了 x,但没有赋值
 std::cout << x << std::endl; // ❌ x 的值是"垃圾值",不确定
 return 0;
}

正确做法:

CPP
int x = 0; // 声明时就初始化
std::cout << x << std::endl; // ✅ 输出 0

💡 提示: 现代 C++ 编译器会警告你使用未初始化的变量,但不要依赖编译器,要养成初始化的好习惯。

(2) 7.2 类型不匹配

错误示例:

CPP
int age;
std::cin >> age;
// 如果用户输入 "abc",age 会保持不变(或更糟)

正确做法(后面会学如何检查输入是否合法):

CPP
int age;
std::cin >> age;
if (std::cin.fail()) {
 std::cout << "输入错误!请输入一个数字。" << std::endl;
}

(这个知识点到第08课会详细讲,现在先知道有这个问题。)



8. 实战:简单计算器

▶ 示例 2:加减乘除计算器(难度⭐⭐)

CPP
#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;
}
▶ 试一试

输出:

TEXT 📖 仅展示
请输入第一个数字:
请输入运算符(+ - * /):
请输入第二个数字:
错误:除数不能为 0!
错误:不支持的运算符!
结果:   = 

运行效果:

TEXT 📖 仅展示
请输入第一个数字:10
请输入运算符(+ - * /):*
请输入第二个数字:5
结果:10 * 5 = 50

💡 提示: 这个程序用到了 if-else(第06课会详细讲),你可以先照抄,理解大概思路。


❓ 常见问题

Q int 和 double 有什么区别?什么时候用哪个?
A int 存整数(如 25、-3),double 存浮点数(如 19.99、3.14)。经验法则:计数/年龄/年份→int;价格/身高/平均成绩→double
Q 为什么 char 只能用单引号,string 用双引号?
A char 是单个字符,用单引号(如 'A');string 是多个字符,用双引号(如 "Hello")。注意 "A"'A' 是完全不同的类型。
Q const 和 #define 有什么区别?
A const 是 C++ 关键字,有类型检查更安全,推荐使用(如 const double PI = 3.14159;)。#define 是 C 风格的宏定义,没有类型检查,不推荐。
Q 变量名可以用中文吗?
A 理论上可以(C++11 支持 Unicode 标识符),但强烈不推荐——跨编译器支持程度不同,且代码难以维护。不要写 int 年龄 = 25; 这样的代码。

▶ 示例 3:类型转换(难度⭐)

CPP
#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;
}
▶ 试一试

输出:

TEXT 📖 仅展示
隐式转换:
C风格转换:
C++风格转换:
💡 提示static_cast<T>() 是C++推荐的类型转换方式,比C风格的 (T) 更安全。



📖 小节

📝 作业

  1. 基础题 (Difficulty ⭐): 编写一个程序,声明三个变量:name(字符串)、age(整数)、score(浮点数),分别赋值并输出。
TEXT 📖 仅展示
我叫 Alice,今年 20 岁,期末成绩 92.5 分。
  1. 进阶题 (Difficulty ⭐⭐): 编写一个程序,让用户输入圆的半径,计算并输出圆的周长和面积(周长 = 2πr,面积 = πr²)。

  2. 用常量定义 π(3.14159)

  3. 输出保留 2 位小数(提示:用 std::fixedstd::setprecision,需要 #include <iomanip>

  4. 挑战题 (Difficulty ⭐⭐⭐): 编写一个程序,实现"华氏温度转摄氏温度":

  5. 让用户输入华氏温度

  6. 用公式 C = (F - 32) × 5/9 计算摄氏温度

  7. 输出结果(保留 1 位小数)

  8. 示例:输入 68,输出"68°F = 20.0°C"

  1. C++ 基本类型:int(整数)、double(浮点)、char(字符)、bool(布尔)、string(字符串)

9. 🚀 下一步

学会了变量和数据类型,接下来我们学习 C++ 的运算符(第04课)—— 让变量之间能做加减乘除、比较大小、逻辑判断。

Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏