有以下程序:
#include <iostream>
using namespace std;
int main()
{
int k = 4, n = 0;
while (n < k)
{
n++;
if (n % 3 != 0)
continue;
k--;
}
cout << k << "," << n << endl;
return 0;
}程序运行后的输出结果是( )。
别急着套公式,这题核心就是死磕 while 循环里 continue 的跳转时机。n 自增后先判断能不能整除 3,不能整除直接跳过后续代码;只有整除时 k 才会减一。抓住这个逻辑,一步步模拟 n=1,2,3 的变化,答案自然浮现。
很多同学会忽略 continue 的作用,以为 n=3 时 k 减一后,循环条件 n<k 不成立就立刻结束,忘了 n 是在循环开头先自增的。还有人会把 continue 当成 break,以为 n=3 时直接跳出整个循环,导致 k 没减或者 n 没变。更隐蔽的错误是认为 n 从 1 加到 4 过程中 k 会一直减,其实只有 n 是 3 的倍数才减,所以 k 只减了一次。记住:continue 只是跳过本次循环剩余语句,不退出循环,下轮 n 还会继续加。
这题考的是最基础的 while 循环流程控制,特别是 continue 语句的跳转行为。很多人对 continue 的理解停留在“跳过本次循环剩余代码”,但具体怎么跳、什么时候跳、跳了之后循环变量怎么变,才是命题人最爱挖坑的地方。
命题人故意把 n%3==0 放在 n 自增之后,又紧跟一个 continue,就是为了制造“看起来应该执行 k--,实际却被跳过”的错觉。同时,循环条件 n<k 在 n 达到 3 时立刻变成假,让学生误以为循环会在 n=3 时提前结束,从而忽略 k 的递减。这种“条件判断 + 分支跳转 + 循环终止”的组合,是信息学初赛里高频出现的陷阱模型。