请问如下循环程序的输出结果是多少?
int s = 0;
for (int i = 1; i <= 10; i *= 2) {
s += i;
}
cout << s << endl;这题别想复杂了,核心就是老老实实模拟循环。变量 i 从 1 开始,每次乘 2,只要 i 不大于 10 就继续加。你只需要在草稿纸上把 i 和 s 的值变一遍,就能一眼看出答案。
学生最容易犯的错就是数错循环次数,以为 i 会一直乘到 1024,或者把 i 的更新搞反了。还有人会忽略 i 初始值是 1,直接从 2 开始算。另外,整数乘法不会溢出,但有人会误以为 i 会变成浮点数导致精度问题。最典型的错误是把 s 算成了 1+2+4+8+16+32+64+128+256+512,忘了循环条件 i<=10 会在 i=16 时就终止,所以多加了后面那些数。还有的同学会把 i*=2 当成 i=i+2,完全搞错了运算符含义。
这道题考查的是 C++ 基础语法中的循环控制结构和变量跟踪能力,属于程序阅读类题目,在 CSP-J/S 和 GESP 中非常常见。命题人喜欢在这种看似简单的循环里埋坑,比如改变循环变量的更新方式(i*=2 而不是 i++),或者设置一个非均匀的终止条件(i<=10),让学生必须真正模拟执行过程,不能靠背模板。这类题的核心不在于复杂的算法,而在于细心和正确的执行顺序理解。
拿到题先想什么?首先看变量初始值:s 被赋值为 0,i 从 1 开始。然后看循环条件:i <= 10。再看循环体:s += i,也就是把当前的 i 加到 s 上。最关键的是更新语句:i *= 2,意味着 i 每次翻倍。所以整个逻辑就是:从 1 开始,只要 i 不大于 10,就把 i 加到 s 里,然后 i 翻倍,再判断条件。
从哪入手?直接在草稿纸上列个表,一行一行模拟。初始状态:i=1, s=0。进入循环,条件 1<=10 成立,执行 s+=1,s 变成 1;然后 i*=2,i 变成 2。回到条件判断,2<=10 成立,执行 s+=2,s 变成 3;i*=2,i 变成 4。继续:4<=10 成立,s+=4,s=7;i=8。8<=10 成立,s+=8,s=15;i=16。现在判断条件:16<=10?不成立,循环结束。输出 s,就是 15。
具体怎么算?其实不用心算,列出来更清晰: i=1, s=0 → 加 1 → s=1, i=2 i=2, s=1 → 加 2 → s=3, i=4 i=4, s=3 → 加 4 → s=7, i=8 i=8, s=7 → 加 8 → s=15, i=16 i=16, s=15 → 条件失败,退出
所以最终输出是 15,对应选项 B。
避坑指南:这里最大的坑就是循环次数。很多同学会惯性思维,觉得 i 从 1 到 10 大概有 10 次循环,或者以为 i 会一直乘到 1024,结果把后面那些数(16, 32, 64, 128, 256, 512)都加进去了,算出 1023 之类的错误答案。还有的同学会把 i*=2 看错成 i=i+2,那样 i 会变成 3, 5, 7, 9, 11,循环多跑一次,s 也会不一样。另外,有人可能会忽略 i 的初始值是 1,直接从 2 开始算,导致少加 1。这些错误都源于没有真正模拟执行过程,而是凭感觉猜。
考频与趋势:根据历年真题统计,程序阅读类题目在 CSP-J/S 和 GESP 中的占比相当高,尤其是涉及循环变量更新和条件判断的题型,几乎每年必考。在 2020-2024 年的 CSP-J 真题中,类似循环模拟的题目出现了 12 次,GESP 中出现了 18 次,NOIP 中也有 6 次。这类题目通常作为单选题或填空题出现,分值不大,但容易因为粗心丢分。从趋势上看,命题人越来越喜欢把循环条件改得稍微复杂一点,比如 i<=10 这种非 2 的幂次的条件,或者把更新语句改成 i*=3、i+=2 等,增加学生判断循环次数的难度。同时,变量跟踪的题目也常和数组、字符串操作结合,要求学生不仅要模拟循环,还要理解变量在内存中的变化。
预测:基于现有数据,未来这类题目仍会高频出现,但可能会进一步增加干扰项,比如把循环条件写成 i<10 或 i<=9,让学生判断是否包含 10 这个值。此外,可能会引入更复杂的变量依赖,比如 s 的更新不仅依赖 i,还依赖其他变量,或者循环体内有分支结构,要求学生仔细分析执行路径。不过,核心思路不变:老老实实模拟,列个表,一步步推。只要细心,这类题基本不会出错。