GESP 四级 · GESP 202403 C++ 四级 第 7 题

选择题 · 答案 D

← 整套速查表 GESP 四级 全部真题

题目

下面 C++ 代码执行以后输出的是( )。

int rc = 5;
int main()
{
    int rc;
    cout << ++rc << endl;

    cout << endl;
    return 0;
}
答案:D

解题思维

别急着看输出,先盯住函数里那句 int rc;。全局有个 rc,局部又定义了一个同名的 rc,这就是变量遮蔽。局部那个没初始化,它的值是垃圾,++rc 的结果自然无法确定。

常见错误

学生最容易掉进两个坑:一是误以为局部变量会自动初始化为 0,选了 1;二是忽略了遮蔽规则,以为局部 rc 继承全局 rc 的值 5,++ 后得 6。这两个选项都是命题人精心设计的干扰项,必须警惕。

详细解析(节选)

考点定位与命题视角

本题考查《GESP 四级 C++ 大纲》“程序结构与数据”模块中的变量作用域与变量初始化规则。命题人这次挖坑非常典型:全局作用域里已经定义了一个 int rc = 5,然后在 main 函数内部又定义了一个同名的 int rc。新手往往只看到变量名,下意识认为它们“共用”同一个值,或者默认局部变量会自动初始化为 0。其实,局部变量如果没有显式初始化,其值是不确定的(indeterminate),也就是所谓的“垃圾值”。

解题心法:从作用域入手

拿到题先做什么?先画作用域边界。全局变量 rc 的作用域是整个程序;main 函数里的 int rc 是一个新的局部变量,它遮蔽了全局的 rc。遮蔽意味着:在 main 函数内部,任何对 rc 的访问都指向这个局部变量,与外面的 rc 毫无关系。既然局部 rc 没有初始化,它的初始值就是随机的。再执行 ++rc,只是把这个随机值加 1,结果依然无法预测。

逐行追踪代码

int rc = 5;           // 全局 rc,值为 5
int main()            // 进入 main,作用域开始
{
    int rc;           // 局部 rc 声明,未初始化,值不确定
    cout << ++rc << endl; // 先自增再输出
    ...
}

1. 全局 rc 被赋值为 5,这是确定的。 2. main 函数内声明局部 rc,此时局部 rc 的值是垃圾(不确定)。 3. ++rc 操作:局部 rc 的值先加 1,再输出。因为局部 rc 原来是垃圾,加 1 后依然是垃圾(只是数值变了,但依然不确定)。 4. 因此输出结果不是 0、1 或 6,而是“不确定”。

陷阱拆解与避坑

反命题思维

如果题目改成 int rc = 0;,那么局部 rc 初始为 0,++rc 输出 1,答案变 B。如果改成 int rc = 5;,输出 6,答案变 C。如果删掉局部 int rc;,则局部 rc 不复存在,访问的是全局 rc,输出 6,答案还是 C。刷到这类题,先问自己三个问题:这个变量有没有被初始化?是否被遮蔽?作用域边界在哪?抓住这三点,就不会掉进坑里。

考频趋势与预测

从题库数据看,基础语法(含变量作用域、初始化)共考过 1295 题,覆盖 11 个级别,其中 2024 年考了 413 题,2025 年考了 401 题,2026 年考了 109 题,呈现逐年上升趋势,说明这类考点在近年考试中权重很大。控制结构考了 429 题,其中 2024 年 138 题、2025 年 160 题,同样高位运行。循环结构考了 609 题,2024 年 128 题、2025 年 158 题,也是高频考点。

综合来看,变量作用域和初始化规则属于基础中的基础,但命题人喜欢在细节上挖坑,比如遮蔽、未初始化、全局与局部的关系等。未来几年,这类题目仍会持续出现,且可能会以更隐蔽的方式考察,例如结合指针、数组或类成员变量来测试学生对作用域的理解深度。暂无足够依据预测具体题型变化,但可以确定的是:只要基础语法和控制结构保持高频,变量作用域的考察就不会降温。

总结

这道题正确答案是 D(不确定)。解题关键在于识别局部变量 rc 被遮蔽且未初始化,从而判断 ++rc 的结果无法确定。学生要警惕“局部变量自动为 0”“局部继承全局”等常见误区,通过作用域分析和变量初始化规则来排除干扰项。

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断