与下面 C++ 输出效果不一致的代码是( )。
int i;
for (i = 0; i < 10; i++)
cout << i;A.
int i = 0;
while (i < 10) {
cout << i;
i += 1;
}B.
int i = 0;
while (i < 10) {
i += 1;
cout << i;
}C.
int i = 0;
while (true) {
cout << i;
i += 1;
if (i >= 10)
break;
}D.
int i = 0;
while (true) {
if (i >= 10)
break;
cout << i;
i += 1;
}答案B。追踪程序输出时注意整数除法截断和循环条件的边界值。变量初始值对结果影响很大。
整数除法截断容易忽略!if(n%i==0)中%是取余运算不是除法。
【考点】循环结构语义|循环体执行顺序
1. 🎯 考纲定位 GESP二级 C++ 模块"循环与控制结构",命题人专门卡住"循环体内部多语句顺序"这个盲点——学生背了循环语法,却对for 循环里 cout 和 i++ 谁先谁后毫无概念。
2. 🧠 解题思维 先手算原式:i=0→1→2→3→4→5→6→7→8→9,共 10 个数且0 开头。 逐项对比:
i+=1,顺序未变,输出 0123456789i+=1 再输出,首项变成 1,输出 123456789(少 0)while(true) 里先输出后 i+=1 后判断,等价于 do-while,输出 0123456789i+=1,等价于原 for,输出 0123456789唯一不一致的是 B。
3. 🪤 陷阱拆解
i++ 挪到输出前,制造"看起来像 for 但其实是 while 先增后输"的假象。break 伪装成无限循环,实则仍是先输出后递进。if 提前,看似多余条件,但逻辑完全等价。i 未显式初始化,但 for 头部的 i=0 已覆盖,所有选项也都显式 i=0,干扰项都做了"表面一致"的伪装。4. 🔄 反命题思维 若把原式改成 for (i = 1; i <= 9; i++) cout << i;,B 依然会输出 2 3 4 5 6 7 8 9(整体偏移),仍是唯一不一致。 刷到类似题,先问自己:"循环体内有多条语句时,它们的先后顺序决定输出序列"。