下面 C++ 代码执行后的输出是( )。
for (i=0; i<10; i++){
if (i % 3)
continue;
printf("0#");
}
if(i>=10)
printf("1#");答案C。追踪程序输出时注意整数除法截断和循环条件的边界值。变量初始值对结果影响很大。
整数除法截断容易忽略!if(n%i==0)中%是取余运算不是除法。
【考点】循环控制|条件表达式|printf输出
1. 考纲定位:GESP二级《C语言程序设计》循环结构与条件判断模块,命题人卡住的是"非零即真"的短路逻辑与循环计数器在循环结束后作用域——二级考生常误以为 i%3 为真时会输出,或忽略循环结束后 i 的值仍可用。
2. 解题思维:看到 if(i%3) 先判断 i%3 是否非零;i=0 时 i%3=0 为假,不跳过,执行 printf("0#");i=1,2 时 i%3 非零,continue 跳过;i=3 时又回到输出;如此循环到 i=9,i=9%3=0 输出,i=10 循环终止;循环结束后检查 if(i>=10) 为真,再输出一串"1#"。注意 i 是局部变量,循环外仍保留值 10,所以最后必定有"1#"。
3. 陷阱拆解:选项 A 把"1#"放在中间,误以为 i=10 时仍在循环内;选项 B 漏掉了 i=9 的输出,把 i%3 当成"整除才输出";选项 D 只输出到 i=6,完全没理解 continue 的跳过逻辑;最阴险的是 i%3 的非零判断,很多考生会下意识以为"i%3"是取余结果,而忽略 C 语言里任何非零值都视为真。
4. 反命题思维:若把 i%3 改成 i%3==0,条件翻转,输出顺序全变;若把循环条件 i<10 改成 i<=10,多一次 i=10 的 printf("0#");刷到类似题先问"这个条件在 C 里是真还是假",别把数学直觉当真相。