GESP 二级 · GESP 202606 C++ 二级 第 20 题

判断题 · 答案 B

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

题目

执行如下 C++ 代码,将从小到大依次输出 abs(N) 个整数,并在最后输出 $1$。

int N;
cin >> N;
int start_num = 1, end_num = N + 1, i;
if (N < 0)
    start_num = N, end_num = 0;
for (i = start_num; i < end_num; i++)
    cout << i << " ";
cout << endl << ((i - 1) == abs(N)) << endl;
答案:B

解题思维

答案B。考点: 循环结构——for/while的执行与嵌套。

常见错误

关键提醒:C++中的^是异或运算符,不是乘方!2^5=7而非32。这是最高频的错误。

详细解析(节选)

【考点】绝对值|负数处理|循环边界

1️⃣ 考纲定位 GESP二级“程序设计基础”中,考查绝对值函数、负数逻辑分支与循环范围的组合运用。命题人卡住的是:很多考生只背了abs()能用,却忽略了当N为负数时,循环起始值start_num = N会进入负数区间,导致输出包含0——这直接违反“从小到大输出abs(N)个正整数"的要求。

2️⃣ 解题思维 看到题先拆解:start_num与end_num在N < 0时被设为N和0,循环条件i < end_num意味着当i从负数递增到0时,0不会被输出(因为i < 0为假)。但题目要求输出abs(N)个数,且最后一个数应为1。因此必须保证循环覆盖abs(N)个正整数,即从1到abs(N),且最终输出固定1。

3️⃣ 陷阱拆解

4️⃣ 反命题思维 若把N < 0分支改为start_num = 1, end_num = abs(N) + 1,并将最后输出改为cout << 1 << endl;,则代码完全正确,答案变为A。命题人故意保留“abs(N)个整数”的模糊表述,就是测试考生是否真正理解“正整数”与“循环范围”的对应关系。

刷到类似题时,先问自己:题目要求的“个数”是否严格对应循环迭代次数?输出末尾是“固定值”还是“条件值”?这题的核心陷阱就在于“正整数”与“布尔表达式”的双重偷换,考生若只凭abs(N)个数就判断正确,必掉入陷阱。

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