执行下面的 C++ 代码时输入 1,则输出是( )。
int month;
cin >> month;
switch(month){
case 1:
cout << "Jan ";
case 3:
cout << "Mar ";
break;
default:
;
}答案C。追踪程序输出时注意整数除法截断和循环条件的边界值。变量初始值对结果影响很大。
整数除法截断容易忽略!if(n%i==0)中%是取余运算不是除法。
【考点】switch 语句|case 穿透|控制流
1. 🎯 考纲定位 GESP 二级 C++ 语法模块,考 switch 语句的穿透陷阱。命题人卡住的是那些只背语法不理解的选手——以为"每个 case 执行完就停",却忘了没有 break 会穿透到下一个 case。这是二级阶段对控制流细致理解的典型考察点。
2. 🧠 解题思维 看到 switch 先想 case 后的 break 有无。month=1 走 case 1 输出"Jan ",没 break 直接穿透到 case 3 输出"Mar ",遇到 break 才跳出。通法:遇到 switch 必须检查每个 case 后面有没有 break,没有的话会穿透到下一个 case,直到遇到 break 或 default。这一类题的本质是"switch 只负责跳转,不负责终止",记住这句口诀就能迁移到所有类似题目。
3. 🪤 陷阱拆解 A 错在以为 case 1 执行完就停(没考虑穿透);B 错在以为 month=1 会跳过 case 1 直接去 case 3(case 标签只是跳转标记,不会判断 month);D 错在认为 switch 每个 case 只会执行一次(实际上没有 break 会连续执行多个 case)。最阴险的是 case 1 后面没有 break——如果你只背结论、不理解本质,就会掉进这个陷阱。命题人最爱用"绝对化表述""偷换概念"来迷惑人,比如"执行完就停"就是典型的偷换概念。
4. 🔄 反命题思维 把 case 1 后面加上 break,输出变"Jan ";month 改成 3,输出变"Mar ";case 1 和 case 3 之间再加一个 case 2 没有 break,会穿透到 case 2,输出"Jan Mar Feb "。如果把 switch 换成 if-else 链,结果完全不一样,因为 if-else 不会穿透。刷到类似题时,先问自己"命题人想考我什么"——是穿透、是跳转、还是控制流?