关于switch语句的流程,请大神,老师详细叙述下
来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/11/01 06:46:14
关于switch语句的流程,请大神,老师详细叙述下
switch(表达式)
{
case 常量表达式1:
case 常量表达式2:
case 常量表达式3: 语句序列1;
case 常量表达式4: 语句序列2;
case 常量表达式5: 语句序列3;
break;
default: 语句序列n+1
}
先阐述学生的理解和疑问: 第一项的switch(表达式)表达式可以是一个变量常量或者是一段符合C语言的公式,有了这个就可以判断对应这个“表达式”下面的值,是否符合自己要判断的. switch下面的大括号就不用学生表达了.case 常量表达式1和case 常量表达式2,为空,只有case 常量表达式3为语句序列1,书本的描述是: 如果switch表达式的多个值需要仔细相同的语句,可以用下面的语句格式,也就是case 常量表达式1到case 常量表达式3,我的理解是判断case 常量表达式1成立时,执行语句序列1,case 常量表达式2成立时,执行语句序列1,case 常量表达式3成立时,也执行语句序列1,学生第一个疑问产生了:如果说case 常量表达式1成立执行语句序列1,执行完后是跳case 常量表达式4,还是说跳到case 常量表达式2,依次继续判断?
break这个我知道,但执行到这个就跳出switch语句
defaultt 这个不是很了解,书面描述是就是当case都不满足时,程序会执行default中的语句,如果把case 常量表达式5 下面的break给default这后面,公式的意思应该是上面的case都不成立时执行default后面的语句,既然是break就是跳出了.这时第二个疑问产生了:default后面的语句序列n+1是什么意思 ,执行上面的语句序列,这个+1是什么意思呢?
switch(表达式)
{
case 常量表达式1:
case 常量表达式2:
case 常量表达式3: 语句序列1;
case 常量表达式4: 语句序列2;
case 常量表达式5: 语句序列3;
break;
default: 语句序列n+1
}
先阐述学生的理解和疑问: 第一项的switch(表达式)表达式可以是一个变量常量或者是一段符合C语言的公式,有了这个就可以判断对应这个“表达式”下面的值,是否符合自己要判断的. switch下面的大括号就不用学生表达了.case 常量表达式1和case 常量表达式2,为空,只有case 常量表达式3为语句序列1,书本的描述是: 如果switch表达式的多个值需要仔细相同的语句,可以用下面的语句格式,也就是case 常量表达式1到case 常量表达式3,我的理解是判断case 常量表达式1成立时,执行语句序列1,case 常量表达式2成立时,执行语句序列1,case 常量表达式3成立时,也执行语句序列1,学生第一个疑问产生了:如果说case 常量表达式1成立执行语句序列1,执行完后是跳case 常量表达式4,还是说跳到case 常量表达式2,依次继续判断?
break这个我知道,但执行到这个就跳出switch语句
defaultt 这个不是很了解,书面描述是就是当case都不满足时,程序会执行default中的语句,如果把case 常量表达式5 下面的break给default这后面,公式的意思应该是上面的case都不成立时执行default后面的语句,既然是break就是跳出了.这时第二个疑问产生了:default后面的语句序列n+1是什么意思 ,执行上面的语句序列,这个+1是什么意思呢?
问题太多,难得打字一一回应,我直接告诉你switch 语句的工作原理,你的问题就不会有了.
对switch语句来说,你可以先不考虑case,最终的代码其实是从上到下顺序执行的.
像你的,代码其实是 :
语句序列1;
语句序列2;
语句序列3;
break;
语句序列n+1;
所以,你马上可以知道,如果没有break会发生什么了,就是下面的代码会一直执行到末尾.
那么case 里面的条件怎么体现?其实在编译时,编译器会建立一个映射关系,它会通过swicth 表达式的结果,来查找一个内部维护的由结果到代码的映射关系.比如目前的情况,如switch的值为常量表达式4,那么结果是,直接goto 到 语句序列2; 的开始处.
所以switch case 其实就是在前面编译器生成代码来判断要跳转到哪里执行而已.那么default 也很好理解了,如果查找不到合适的匹配,就goto到 Default 的代码处呗.
整个过程就是这样,这很清楚了吧?
再问: 十分感谢这个老师,原来case就类似goto的关系,我想详细问下case1,2都为空,只有3处有那个语句序列1,是不是无论1,或者2匹配,都会依次往下执行,而不是执行了语句序列1 就跳到了case4往后面执行。default就是上面都不符合,自己添加一条类似else的语句结束一样的吧,感觉default不是很重要,有些例子甚至没有这个出现,这样对吗老师
再答: 理解的不是怎么正确哦,case 1,2,3,说白了就是GOTO到同一个地址而已。后面的事就完全一样了。“语句序列1;”执行完了就执行“语句序列2;”,这里没有什么跳到不跳到,本来代码就是放在一起的。我说过了,case 其实全部被提前到外面判断了,里面的代码全是放在一起的。
对switch语句来说,你可以先不考虑case,最终的代码其实是从上到下顺序执行的.
像你的,代码其实是 :
语句序列1;
语句序列2;
语句序列3;
break;
语句序列n+1;
所以,你马上可以知道,如果没有break会发生什么了,就是下面的代码会一直执行到末尾.
那么case 里面的条件怎么体现?其实在编译时,编译器会建立一个映射关系,它会通过swicth 表达式的结果,来查找一个内部维护的由结果到代码的映射关系.比如目前的情况,如switch的值为常量表达式4,那么结果是,直接goto 到 语句序列2; 的开始处.
所以switch case 其实就是在前面编译器生成代码来判断要跳转到哪里执行而已.那么default 也很好理解了,如果查找不到合适的匹配,就goto到 Default 的代码处呗.
整个过程就是这样,这很清楚了吧?
再问: 十分感谢这个老师,原来case就类似goto的关系,我想详细问下case1,2都为空,只有3处有那个语句序列1,是不是无论1,或者2匹配,都会依次往下执行,而不是执行了语句序列1 就跳到了case4往后面执行。default就是上面都不符合,自己添加一条类似else的语句结束一样的吧,感觉default不是很重要,有些例子甚至没有这个出现,这样对吗老师
再答: 理解的不是怎么正确哦,case 1,2,3,说白了就是GOTO到同一个地址而已。后面的事就完全一样了。“语句序列1;”执行完了就执行“语句序列2;”,这里没有什么跳到不跳到,本来代码就是放在一起的。我说过了,case 其实全部被提前到外面判断了,里面的代码全是放在一起的。