1.概述
- if-else 结构和 switch-case 结构都可以用来作为分支语句的选择,但二者在使用方面还是有区别的:
if 语句适用于连续值的判断,例如一片区域的判断
switch 语句适用于对离散值的判断,例如单个数字或者字符
在使用switch 语句的时候我们都知道需要在分支语句的最后加上 break;
如果不加的话后面的语句会被继续执行,这是为什么呢?
2.分析
2.1两个代码模块以及输出
test1.c
#include <stdio.h>
#define PRINTF_D(num) printf(#num" = %d\r\n",num)
int main()
{
int a =1;
switch (a)
{
case 0:
{
PRINTF_D(0);
}
case 1:
{
PRINTF_D(1);
}
case 2:
{
PRINTF_D(2);
}
case 3:
{
PRINTF_D(3);
}
default:
PRINTF_D(-1);
}
return 0;
}
输出:
1 = 1
2 = 2
3 = 3
-1 = -1
test2.c
#include <stdio.h>
#define PRINTF_D(num) printf(#num" = %d\r\n",num)
int main()
{
int a =1;
switch (a)
{
case 0:
{
PRINTF_D(0);
}
case 1:
{
PRINTF_D(1);
}
case 2:
{
PRINTF_D(2);
break; //!!!注意这里
}
case 3:
{
PRINTF_D(3);
}
default:
PRINTF_D(-1);
}
return 0;
}
输出:
1 = 1
2 = 2
2.2区别
代码区别 | 输出区别 |
---|---|
2.3 原因
- 为什么不加break; 后面的语句可以继续输出呢?它不是匹配的值不一样吗?
带着这个疑问,我们来看一下这两个模块的汇编语言的区别:
红色的部分就是二者的区别了。我们来大概看一下.L6 的汇编代码的意思
把2传递给esi寄存器
把.LC2传递给edi寄存器
把0传递给eax寄存器
调用printf
无条件跳转到 .L8
如果没有break,后面的段就会继续执行。
3.总结
你可以这样理解switch - case 语句:
- 它具有”跳转“的作用
- 当和某一个数字或者字符匹配上的时候,就会跳转到对应的入口地址处
- break 也具有"跳转"的作用
- 当匹配对应的时候,执行跳转到对应的入口地址,后面就会顺着这个地址一直执行下去
4.参考
汇编指令参考如下:
https://blog.csdn.net/weixin_32589873/article/details/78207020
https://blog.csdn.net/m0_37806112/article/details/80549927