执行如下 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。考点: 循环结构——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️⃣ 陷阱拆解
abs(N)个整数”的模糊表述,让考生忽略“正整数”这一关键限定。若只看abs(N)个数,负数时循环会输出N, N+1, …, -1, 0,共|N|+1个数,明显超量。cout << ((i - 1) == abs(N))。当N为负数时,i最终为0,i - 1 = -1,与abs(N)不相等,输出0;当N为正数时,i最终为N+1,i - 1 = N,输出1。但题目要求无论N正负,最后都输出1,这里用布尔表达式替代常数1,是典型的“偷换概念”。abs()虽能正确处理正负,但循环边界未同步修正,导致输出序列长度和数值范围均错误。4️⃣ 反命题思维 若把N < 0分支改为start_num = 1, end_num = abs(N) + 1,并将最后输出改为cout << 1 << endl;,则代码完全正确,答案变为A。命题人故意保留“abs(N)个整数”的模糊表述,就是测试考生是否真正理解“正整数”与“循环范围”的对应关系。
刷到类似题时,先问自己:题目要求的“个数”是否严格对应循环迭代次数?输出末尾是“固定值”还是“条件值”?这题的核心陷阱就在于“正整数”与“布尔表达式”的双重偷换,考生若只凭abs(N)个数就判断正确,必掉入陷阱。