GESP C++ 1 级 · 知识点

变量的定义与使用

变量是 C++ 中存放数据的基本单位,一级要求掌握变量的定义格式、命名规则,以及赋值与使用的先后顺序。

对应知识域:变量的定义与使用相关真题 4 套

本页为本站原创整理,例题与解析均由本站编写,不取自任何题库原题;考试范围以 CCF 官方公布为准,本平台不是 GESP 官方平台。

考纲要求

  • 掌握变量定义的基本格式:先写类型,再写变量名,必要时用等号给出初始值,语句以分号结束。
  • 掌握变量命名规则:只能由字母、数字和下划线组成,不能以数字开头,不能使用 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;。

同一个变量可以多次赋值吗?

可以。变量之所以叫变量,就是因为它的值可以改变;后一次赋值会覆盖前一次的值,程序读到的是最近一次赋的值。

本级别其他知识点

官方依据