先来看几个实例
1、
实例源代码为:
#include<stdio.h> int main() { int i = 2; switch (i) { default: printf("%s\n", "default"); case 1: printf("%s\n", "case 1"); case 2: printf("%s\n", "case 2"); case 3: printf("%s\n", "case 3"); } return 0; }
当i为2时输出为:
case 2
case 3
当将i该为0时输出为:
default
case 1
case 2
case 3
2、现在将default语句放在case语句的中间
实例代码为:
#include<stdio.h> int main() { int i = 2; switch (i) { case 1: printf("%s\n", "case 1"); default: printf("%s\n", "default"); case 2: printf("%s\n", "case 2"); case 3: printf("%s\n", "case 3"); } return 0; }
当i为2时输出为:
case 2
case 3
当将i改为0时输出为:
default
case 2
case 3
解析:其实switch语句一般是如下这样处理的(在编译器没有优化的情况下)
【对于上面实例2的代码,这里用类似汇编代码的伪代码来说明其执行过程】
if(i == 1)
jmp to case 1;
else if (i == 2)
jmp to case 2;
else if (i == 3)
jmp to case 3;
else
jmp to default;
case 1: printf("%s\n", "case 1");
default: printf("%s\n", "default");
case 2: printf("%s\n", "case 2");
case 3: printf("%s\n", "case 3");
上面用的说明方式有点不伦不类,但很说明问题。它给出了一种汇编代码解释switch语句的方式。
首先判断i与各个case后的条件值是否相等,然后进行相应的跳转。不管你编写的代码中default
放在那里,这里的条件判断都是先按顺序比较其他非default值,当这些条件都不满足的时候,
才跳转到default的相应代码处执行。将每一种情况的处理代码加上标号按你的语句给出的顺序排
列在开始判断语句的后面。这就是switch的汇编解析,即它真正被编译为可执行程序的样子。
这里给出的是一般的情况,编译器可能有各种优化的措施,其汇编代码可能和上面的形式不同
但效果是一样的,只要按照上面的原理去推就可以了。
还可以参考这里。
你懂了吗?赶快弄两个实例验证一下吧。