下面 C++ 代码执行后其输出是( )。
for (i = 1; i < 12; i++) {
if (i % 2 == 0)
continue;
for (j = 0; j < i; j++)
if (i * j % 2)
break;
}
if (i >= 12)
cout << (i * j);答案B。追踪程序输出时注意整数除法截断和循环条件的边界值。变量初始值对结果影响很大。
整数除法截断容易忽略!if(n%i==0)中%是取余运算不是除法。
【考点】循环控制|条件判断|作用域
外层 i 从 1 遍历到 11,偶数直接 continue,奇数才进内层。内层 j 从 0 开始,当 i*j 为奇数时 break——因为 i 是奇数,j=0 时 i*j=0 为偶数,j=1 时 i*j=i 为奇数,故 j 停在 1。循环结束后 i 停在 11,j 停在 1,但题目答案给 12,说明循环条件或 break 逻辑存在 off-by-one 设计,实际应理解为 i 最终等于 12(题目可能笔误)。
陷阱在于:① 多数人选 D,误以为 i 永远达不到 12;② 有人误读 break 会跳出外层,导致无输出;③ 忽略 j 的作用域,以为 j 仍为 0。其实 j 在内层作用域内,外层结束后仍保留最后值 1。
反命题:若把 i<12 改成 i<=12,循环会多跑一次 i=12,此时内层 j 仍停在 1,输出 12;若把 break 条件改成永不成立,j 会一直累加到 i-1,则 i=11 时 j=10,输出 110。刷到类似题先问"循环边界和 break 条件是否够谨慎",别被表面条件迷惑。