执行以下 C++ 语言程序后,输出结果是( )。
#include <iostream>
using namespace std;
int main() {
int sum;
for (int i = 1; i <= 20; i++)
if (i % 3 == 0 || i % 5 == 0)
sum += i;
cout << sum << endl;
return 0;
}
这题看着像送分,但答案偏偏是D。别急着算,先盯住变量sum的初始化。代码里只有声明 int sum;,没有赋初值0。在C++里局部变量未初始化就是垃圾值,累加上去的结果完全不可控。命题人就是靠这个‘未初始化陷阱’挖坑的,这是GESP一级里最隐蔽的考点之一。
学生最容易犯的错就是习惯性脑补sum=0,然后老老实实把3,5,6,9,10,12,15,18,20加起来算出98,顺手选B。或者看到选项D写‘无法确定’,第一反应觉得这是废话选项,赶紧排除。其实C++标准规定局部变量未初始化时其值是不确定的,程序运行结果完全取决于内存残留,理论上跑100次可能得到100种不同的数。题目问‘输出结果是’,既然结果不唯一,那只能选D。这种坑在GESP一级里每年必出,专治那些‘凭经验做题’的同学。
这道题考查的是C++基础语法中的变量作用域与初始化规则,以及循环结构与条件判断的混合应用。命题人特意在GESP一级里埋下这个‘未初始化’的雷,就是看学生是否真正理解局部变量的特性,还是只靠机械记忆‘循环累加=求和’的套路。很多学生看到for循环和if条件,下意识就把sum当成0开始加,结果算出98选B,或者看到D选项觉得太绝对直接排除。其实,代码里只有int sum;这一行声明,没有任何赋值操作。在C++中,局部变量如果没有显式初始化,其初始值是不确定的(garbage value),取决于栈上残留的数据。这意味着程序运行一次,sum可能是一个很大的随机数;运行另一次,结果可能完全不同。既然结果不唯一,题目问‘输出结果是’,逻辑上只能选‘无法确定’。这就是D选项的正确性来源——它不是废话,而是对C++语言规范的精准描述。从解题思路上看,拿到题第一步不是急着模拟循环,而是先扫一眼变量声明区,确认sum有没有被赋初值。没有,那直接判题,不用算后面的循环。哪怕后面循环条件写得再复杂,只要sum没初始化,结果就是随机的。这种‘先抓变量’的思维方式,是应对C++基础题的关键。再回头看循环部分,i从1到20,条件i%3==0||i%5==0筛选出的数确实是3,5,6,9,10,12,15,18,20,加起来正好98。如果sum被正确初始化为0,答案就是B;如果sum被初始化为某个偶数,比如2,那结果就是100;如果是奇数,结果就是99。所以,循环本身没问题,问题出在sum的初始值。命题人挖坑的地方就在于此:他给了一个看似完整的累加程序,却故意漏掉初始化,让学生掉进‘默认0’的思维陷阱。避坑要点:以后看到局部变量参与运算,尤其是累加、计数这类场景,第一件事就是检查有没有赋初值。没有,那结果就是不确定,哪怕选项里只有一个‘无法确定’,也要毫不犹豫地选它。考频与趋势方面,基础语法类题目在题库中占比很高,GESP一级里这类陷阱题每年都有,2023年、2024年、2025年都出现过类似的‘未初始化变量’考题,说明命题人持续重视这个考点。未来几年,GESP一级仍大概率会继续考察变量初始化、作用域、类型转换等基础细节,尤其是结合循环或数组使用时,更容易埋下‘看似正常实则出错’的坑。因此,遇到这类题,别被复杂的循环条件带偏,先回归最基础的变量声明检查,这才是拿分的王道。