考纲要求
- 掌握变量定义的基本格式:先写类型,再写变量名,必要时用等号给出初始值,语句以分号结束。
- 掌握变量命名规则:只能由字母、数字和下划线组成,不能以数字开头,不能使用 C++ 关键字,区分大小写。
- 理解「先定义、后使用」:变量必须在定义之后才能出现在表达式里。
- 区分赋值与初始化,理解同一个变量可以被反复赋值,后一次赋值会覆盖前一次的值。
典型题型
- 给出若干名字,判断哪些可以作为合法的变量名。
- 给出一段含变量定义与赋值的程序,要求写出输出结果。
- 在一段程序里找出「未定义就使用」或「未赋初值就参与运算」的错误。
常见错误
- 写出以数字开头的变量名,例如 2a,这在 C++ 中不合法。
- 把变量名写成关键字,例如用 int 或 for 当变量名,编译器会直接报错。
- 变量定义后没有赋初值就参与运算,此时它的值不确定,结果不可预期。
- 把赋值符号 = 当成数学上的等于,写出 a = b 却以为在比较 a 和 b 是否相等。
- 同一作用域内重复定义同名变量,导致编译错误。
深入理解
变量在内存里是什么样子
写 int age = 12; 时,编译器做了三件事:按 int 的大小在内存里划出一块空间,给这块空间起名叫 age,把 12 写进去。此后程序里出现 age,指的都是这块空间,而不是那个数字本身。
这解释了两个现象。第一,变量名只是地址的别名,改名不影响值,换值也不需要改类型。第二,同一个名字在同一时刻只对应一块空间,所以重复定义会报错,而重复赋值的后一次会覆盖前一次。
初始化、赋值、声明是三件事
- 声明:只告诉编译器「有这么个名字、类型是什么」,例如
int sum;。 - 初始化:定义的同时给第一个值,例如
int sum = 0;。 - 赋值:定义之后用
=改值,例如sum = 5;。
一级最常考的是「累加器必须先初始化」:写 int sum; 然后循环里 sum = sum + i;,第一次执行时右边的 sum 是内存里的垃圾值,结果完全不可控。正确写法是 int sum = 0;。这条规则不是语法强制,而是结果正确的前提,这类题几乎每年都出现。
交换两个变量的固定三步
交换 a 和 b 必须借助临时变量,顺序不能颠倒:
int t = a;
a = b;
b = t;如果先写 a = b,a 原来的值就被覆盖了,后面再怎么赋值也找不回来。把这个三步想成「把 a 倒进空杯子 t,把 b 倒进 a,再把 t 倒回 b」,就不会错。一号级还可能考不借助第三个变量的写法(a = a + b; b = a - b; a = a - b;),能看懂即可,平时还是用临时变量更清楚。
自编例题
交换两个变量的值
读入两个整数,交换它们的值后输出。请说明为什么需要第三个变量。
#include <iostream>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
int t = a;
a = b;
b = t;
cout << a << " " << b << endl;
return 0;
}如果直接写 a = b,a 原来的值就被覆盖了,再也找不回来,所以必须先把它存进临时变量 t。三步的顺序是固定的:先把 a 存进 t,再用 b 覆盖 a,最后用 t 还原 b。这里 t 的定义放在使用之前,符合「先定义、后使用」;a 和 b 通过 cin 获得初值,避免了使用未初始化变量的错误。
相关真题
这块内容在整条路线里的位置:GESP C++ 1 级备考路径。
READY TO START
开始练习
先做一套本级别测评,报告会指出哪些知识点需要重点补;再回到本页对照考纲要求逐条核对,把不确定的条目记下来集中练。
常见问题
变量名可以用中文吗?
按一级要求掌握的是由字母、数字和下划线组成的命名规则,中文变量名虽然在部分编译器上能通过,但不属于考试要求,实际编程中也不建议使用。
定义变量时一定要给初值吗?
语法上不一定,但不给初值的变量内容是未确定的,一旦参与运算结果就不可靠。稳妥的做法是定义时就给出初始值,例如 int sum = 0;。
同一个变量可以多次赋值吗?
可以。变量之所以叫变量,就是因为它的值可以改变;后一次赋值会覆盖前一次的值,程序读到的是最近一次赋的值。
