跳转至

变量与数据类型

什么是变量?

程序要处理数据,数据就要有个「家」。变量就是一个带名字的盒子,用来存放数据。

比如我们要计算两个数的和,就要先把这两个数放进盒子,再取出来运算:

#include <iostream>
using namespace std;

int main() {
    int a = 3;      // 定义一个叫 a 的盒子,放入 3
    int b = 5;      // 定义一个叫 b 的盒子,放入 5
    int sum = a + b; // 把 a 和 b 里的值相加,放进新盒子 sum
    cout << sum << endl;
    return 0;
}

运行输出 8。

int a = 3; 这句话做了两件事:

  1. 声明:向系统申请一个能放整数的盒子,取名 a
  2. 赋值:把 3 放进去

常用数据类型

盒子有不同规格——放整数、放小数、放字符,用的类型不一样:

类型 用途 举例 大小 范围(约)
int 普通整数 10, -7, 0 4 字节 \(-2.1 \times 10^9\) ~ \(2.1 \times 10^9\)
long long 大整数 12345678901234 8 字节 \(-9.2 \times 10^{18}\) ~ \(9.2 \times 10^{18}\)
double 小数 3.14, -0.5 8 字节 约 15~16 位有效数字
char 单个字符 'A', '+' 1 字节 一个字符
bool 真假 true, false 1 字节 只有两种值
int age = 11;
long long bigNum = 3000000000LL;   // 超过 21 亿,必须用 long long
double pi = 3.14159;
char grade = 'A';
bool isOK = true;

竞赛第一坑:整数溢出

int 最大只能存约 21 亿。两道 10 亿级别的数相加,int 就装不下了, 结果会「绕回去」变成一个离谱的负数——这叫溢出。

经验法则:题目中数据超过 \(10^9\)、或涉及乘法时,果断用 long long。 这是 CSP 每年都有人栽跟头的地方。

标识符命名规则

给盒子(变量)起名字有规矩:

  • 只能由字母、数字、下划线组成,且不能以数字开头
  • 区分大小写:sum 和 Sum 是两个变量
  • 不能用关键字(如 int、return)

好的命名让人一看就懂:score(分数)、maxLen(最大长度);坏的命名过两天自己都看不懂:a1、tmp2。

常量:不会变的盒子

有些量整个程序运行期间都不变,比如圆周率。可以用 const 修饰:

const double PI = 3.14159265358979;

const 变量不能再被修改,这样能防止手滑改错。

例题:交换两个变量

题目描述 读入两个整数 \(a\) 和 \(b\),把它们交换后输出。

输入格式 一行两个整数 \(a\)、\(b\)。

输出格式 一行两个整数,用空格分隔,即交换后的结果。

数据范围 \(0 \le a, b \le 10^9\)。

样例输入 / 样例输出

3 8
8 3

思路分析 就像两杯水交换要先借第三个空杯子:先把 \(a\) 存进临时变量 \(t\),再把 \(b\) 装进 \(a\),最后把 \(t\) 装回 \(b\)。

参考代码

#include <iostream>
using namespace std;

int main() {
    int a, b;
    cin >> a >> b;
    int t = a;      // 空杯子先装下 a
    a = b;          // b 的值装进 a
    b = t;          // 杯子里原来的 a 装进 b
    cout << a << " " << b << endl;
    return 0;
}

顺手记一个工具

C++ 还自带交换函数 swap(a, b);(需 #include <algorithm>),效果一样。 但借杯子交换的原理必须懂,笔试会考。

动手试一试

  1. 定义变量保存你的年龄和身高,输出一句话介绍自己
  2. 计算 \(1000000 \times 1000000\),分别用 int 和 long long 存结果,观察区别
  3. 思考:char c = 'A'; 之后执行 c = c + 1;,c 变成了什么字符?(提示:字符在电脑里是数字)

下一课,我们让程序学会「对话」:输入与输出。