下面的 C++ 代码段执行将不会有输出,因为内层循环 j 总是 0 开始,i * j % 10 == 0 将会被满足,执行 break,故而 i 小于 $10$,不会满足 if 判断条件。( )
for (i = 1; i < 10; i++)
for (j = 0; j < i; j++)
if (i * j % 10 == 0)
break;
if (i >= 10)
cout << (i * j);答案B。考点: 循环结构——for/while的执行与嵌套。
关键提醒:C++中的^是异或运算符,不是乘方!2^5=7而非32。这是最高频的错误。
【考点】循环结构 | 条件判断 | 变量作用域
1. 🎯 考纲定位 二级大纲中,循环结构是基础语法,条件判断是必考,但题目设计了一个陷阱,即内层循环的 break 导致外层循环的变量 i 被修改,而外层循环结束后 i 的值可能不满足 if 判断条件。这卡住了绝大多数考生对变量作用域和循环变量持久性的理解。命题人为什么在试卷里放这道题——它卡住了绝大多数考生的"break 只跳出内层循环,外层循环变量 i 会继续累加"的盲点。
2. 🧠 解题思维 看到题先想内层循环 j 从 0 开始,i * j % 10 == 0 在 j=0 时成立,break 跳出内层循环。但外层循环 i 会继续增加,直到 i >= 10 时循环结束。此时 i 的值为 10,满足 if 条件,会输出 i * j,但 j 是内层变量,在 break 后 j 的值是 0,所以输出 0?但题目说不会有输出,这是错误的。因此,解题思维要强调:内层循环 break 不影响外层循环的 i 值,外层循环结束后 i 为 10,满足 if,理论上应该输出,但题目断言不会有输出,所以是错的。通法:遇到 break 跳出内层循环,要记住外层循环变量会正常递增,不要误以为 break 会立即结束整个程序。
3. 🪤 陷阱拆解 A 选项说正确,但实际错误,因为外层循环结束后 i 会达到 10,满足 if 条件,会输出。B 选项说错误,正确。陷阱在于:内层循环 break 后,i 仍然在增加,考生容易忽略这一点,以为 break 会立即退出整个程序。命题人利用了这个思维误区,让考生误以为 i 不会达到 10。此外,绝对化表述"总是 0 开始"虽然正确,但忽略了外层循环的 i 变化,这是偷换概念。边界条件:i 从 1 到 9 循环,j 从 0 到 i-1,当 i=10 时循环结束,此时 i=10,满足 if。语义陷阱:题目说"不会有输出",但实际会输出 0,不过输出的是 i * j,j 是内层变量,在 break 后 j 为 0,所以输出 0,但题目没有提到输出 0,只是说不会有输出,这也是误导。总之,陷阱在于忽略 break 后外层循环继续,i 会累加到 10,从而满足 if 条件。
4. 🔄 反命题思维 站在命题人角度,如果把条件改一下,比如把 break 改成 continue,或者把内层循环改为 j 从 1 开始,那么 i * j % 10 == 0 可能不会在 j=0 时满足,break 不会触发,外层循环会继续,i 可能不会达到 10,从而 if 条件不满足,输出不会发生。或者把外层循环改为 i <= 9,那么 i 永远不会达到 10,if 条件永远不满足,输出不会发生。这样题目就会变成正确。提醒:遇到类似题,先问自己"命题人想考我什么",这里考的是 break 对循环变量的影响,以及外层循环的持续执行。