下图所示 C++ 代码对大写字母 'A' 到 'Z' 分组,对每个字母输出所属的组号,那么输入 'C' 时将输出的组号是( )。
char c;
while(1){
cin >> c;
if(c=='q') break;
switch(c){
case 'A': cout << "1 "; break;
case 'B': cout << "3 ";
case 'C': cout << "3 ";
case 'D': cout << "5 "; break;
case 'E': cout << "5 "; break;
default: cout << "9 ";
}
cout << endl;
}拿到题先别急着看输出,把switch里每个case后面有没有break圈出来,再按执行流顺一遍——C匹配到3后没有break,会穿透到D输出5,D有break就停了,所以是3 5。
很多同学一看到case 'C' 就以为只输出3,忘了switch的穿透特性。还有人会误以为穿透到底会落到default,选了3 5 9,其实D后面有break,根本过不去。最坑的是把case 'D' 的break看成case 'C' 的,或者以为没有break就会一直往下走,结果把default也算进去了。记住:穿透只发生在没有break的case里,遇到break立刻跳出switch。
【考点】switch语句的执行流与break控制|语句穿透(fall-through)
这道题考查的是GESP一级"基础语法"模块中的switch条件分支考点。命题人卡住的是初学者对switch执行流的误解——以为每个case天然就是独立的分支,完全忽略C++语言的"穿透执行"特性。很多学生背下"switch按序匹配",却忘了"匹配成功后若没有break,会继续向下执行下一个case"这一条铁律。