下面 C++ 代码执行以后输出的是( )。
int rc = 5;
int main()
{
int rc;
cout << ++rc << endl;
cout << endl;
return 0;
}别急着看输出,先盯住函数里那句 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”“局部继承全局”等常见误区,通过作用域分析和变量初始化规则来排除干扰项。