找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3124|回复: 29
收起左侧

请教C语言SWITCH语句流程的问题

  [复制链接]
ID:47286 发表于 2020-10-19 18:11 | 显示全部楼层 |阅读模式
教材上都说if.....else if是挨着找 有多少个else if就找多少个 而 switch是直接跳转 我想问的是 假设有5个case 而要查找的值在这5个case之外 那么这个语句是把12345都搜一遍发现没有才走default还是直接就去default了 它怎么知道查找值在不在范围内
回复

使用道具 举报

ID:641187 发表于 2020-10-19 18:16 | 显示全部楼层
程序是从上往下读取的,应该也是一个一个的从case1234往下读吧,最后都不满足才会是default。不满足你给的case条件不就是不在它查找范围啦
回复

使用道具 举报

ID:342954 发表于 2020-10-19 18:20 | 显示全部楼层
都是顺序执行的
回复

使用道具 举报

ID:47286 发表于 2020-10-19 18:35 | 显示全部楼层
12138黄晨瑞 发表于 2020-10-19 18:16
程序是从上往下读取的,应该也是一个一个的从case1234往下读吧,最后都不满足才会是default。不满足你给的c ...

那岂不是和if....else if一样了 在有很多个选项的时候 效率并不比if语句好啊 为什么还要这么个东西

if.....else if里 如果有20个else if 假设都不是 程序也会走20个 教材里说switch的优点 不就是多分支直接跳转吗 每一个case只是个标签 我能理解假设20个case时 可以直接跳到任何一个 但假设20个都不是呢 它也都扫一遍么
回复

使用道具 举报

ID:508386 发表于 2020-10-19 19:13 | 显示全部楼层
和if  else没啥太大区别  无非是  运行速度快   
不熟的话  没必要用
回复

使用道具 举报

ID:267932 发表于 2020-10-19 19:34 | 显示全部楼层
SWITCH 里嵌套SWITCH ,SWITCH 处理快点,而且有助于程序分析,好多个IF  else 看着都乱
回复

使用道具 举报

ID:453974 发表于 2020-10-19 19:54 | 显示全部楼层
要是单论switch程序的执行方式的话,肯定是要从上往下依次执行的。要论if和switch的优缺点的话,只能说各有优劣,无所谓哪个执行时间更短,正常逻辑下执行起来都是微秒级的,只不过if和switch的灵活度不同,光讨论执行时间的话,个人感觉没什么意义
回复

使用道具 举报

ID:711539 发表于 2020-10-19 19:59 | 显示全部楼层
直接就去default了。通过switch()语句()中的值匹配标签case,都不匹配就跑default!
回复

使用道具 举报

ID:518902 发表于 2020-10-19 20:08 | 显示全部楼层
switch会一条一条的和你的条件比对
如果是真,就会执行这一条,如果你不加break,还会执行后往下看有没有符合条件的。
如果加了 就会跳出去。
如果都不符合 才会用default
回复

使用道具 举报

ID:47286 发表于 2020-10-19 23:34 | 显示全部楼层
8楼9楼两位前辈 你俩说的正相反啊 呃。。。。。。。。
回复

使用道具 举报

ID:88256 发表于 2020-10-19 23:44 | 显示全部楼层
dzbj 发表于 2020-10-19 18:35
那岂不是和if....else if一样了 在有很多个选项的时候 效率并不比if语句好啊 为什么还要这么个东西

if ...

就多个选择的话,你不觉得switch看起来比if简洁直观吗?
回复

使用道具 举报

ID:47286 发表于 2020-10-20 00:01 | 显示全部楼层
hhdsdy 发表于 2020-10-19 23:44
就多个选择的话,你不觉得switch看起来比if简洁直观吗?

哥 咱不讨论这个 用法不一样
回复

使用道具 举报

ID:88256 发表于 2020-10-20 00:10 | 显示全部楼层
dzbj 发表于 2020-10-20 00:01
哥 咱不讨论这个 用法不一样

“那岂不是和if....else if一样了 在有很多个选项的时候 效率并不比if语句好啊 为什么还要这么个东西”
这个是你自己问的,现在竟然说不讨论这个了
回复

使用道具 举报

ID:420836 发表于 2020-10-20 08:02 | 显示全部楼层
C语言Switch-CASE接连执行一次,直到完成所有情况,然后再执行默认操作。
回复

使用道具 举报

ID:641187 发表于 2020-10-20 10:02 | 显示全部楼层
dzbj 发表于 2020-10-19 18:35
那岂不是和if....else if一样了 在有很多个选项的时候 效率并不比if语句好啊 为什么还要这么个东西

if ...

理论上是这样的,而且程序都是从上往下读取的呀,他不能跳着读的
回复

使用道具 举报

ID:593233 发表于 2020-10-20 10:44 | 显示全部楼层
c从上到下依次执行
回复

使用道具 举报

ID:592807 发表于 2020-10-20 12:09 | 显示全部楼层
dzbj 发表于 2020-10-19 18:35
那岂不是和if....else if一样了 在有很多个选项的时候 效率并不比if语句好啊 为什么还要这么个东西

if ...

switch语句如果不在case后面加brea关键字的话可以选择插入执行点,从符合条件的语句开始从上往下执行,知道碰上break或者执行完所有语句自动退出,如果default被放在最前面,所有语句不加break,程序会执行所有的语句。if_else if不行,只要有一个判断条件符合,其他的else if语句全被失效。
举个例:”num = 1的话,上面结果是  a = 1+2+3 = 6.下面是a = 0+1 = 1;int a = 0;
switch(num)
{
   case 0:a+=0;
  case 1:a+=1;
  case 2:a+=2;
default:a+= 3;break;
}

if(num == 0){a++0;}
else if(num == 1){a+=1;}
else if(num == 2){a+=2;
eles{a+=3;}


回复

使用道具 举报

ID:47286 发表于 2020-10-20 15:29 | 显示全部楼层
hhdsdy 发表于 2020-10-20 00:10
“那岂不是和if....else if一样了 在有很多个选项的时候 效率并不比if语句好啊 为什么还要这么个东西”
...

你误会了 我意思是说 不讨论看着舒服不舒服 只聊switch这家伙怎么干活
回复

使用道具 举报

ID:47286 发表于 2020-10-20 15:39 | 显示全部楼层
12138黄晨瑞 发表于 2020-10-20 10:02
理论上是这样的,而且程序都是从上往下读取的呀,他不能跳着读的

你说的这点我有不同看法 我测试过在switch中多分支可以随便排列 比如3个分支1 3 5 可以1 5 3 也可以5 3 1 结果都是正确的
回复

使用道具 举报

ID:47286 发表于 2020-10-20 15:47 | 显示全部楼层
黄youhui 发表于 2020-10-20 12:09
switch语句如果不在case后面加brea关键字的话可以选择插入执行点,从符合条件的语句开始从上往下执行,知 ...

感谢 你让我学到switch的新用法了 可能很普通 但我过去不知道也没想过

每个case都对应break的情况下 switch是对比一下标签里没50就过去 还是真进去从1到3找一遍 没50才跳出

num=50;

switch(num)
{
case 1:
break;

case 2:
break;

case 3:
break;

defalut:
break;
}
回复

使用道具 举报

ID:47286 发表于 2020-10-20 16:13 | 显示全部楼层
我个人理解 假设 a=2 分支是 1 2 3

switch是扫描标签 有2直接到2 没有2走default
if.....else if是1不满足看2 2满足跳出 否则看3

那么a=50 分支还是 1 2 3 理论上switch应该也是走一下default然后跳出 但因为没这么用过 想请教前辈们是不是这样 比如会汇编的有没有用汇编看看switch具体怎么走流程的 我是光会用 底层的不了解
回复

使用道具 举报

ID:392682 发表于 2020-10-20 16:42 | 显示全部楼层
恩恩,我也是这么理解的。switch CASE,应该是直接跳转到相应的语句的。感觉是switch在被编译的时候变成了一些特殊指令,,
回复

使用道具 举报

ID:834134 发表于 2020-10-26 10:53 | 显示全部楼层
是按顺序case下来的
回复

使用道具 举报

ID:834651 发表于 2020-10-26 12:21 | 显示全部楼层
不会都找一边,case相当于分配标签,switch发现没有匹配的会直接default,和数组能达到O(1)的原理一样。
回复

使用道具 举报

ID:311846 发表于 2020-10-26 13:57 | 显示全部楼层
dzbj 发表于 2020-10-19 23:34
8楼9楼两位前辈 你俩说的正相反啊 呃。。。。。。。。

没有相反 是你不理解而已
回复

使用道具 举报

ID:833190 发表于 2020-10-27 08:27 | 显示全部楼层
dzbj 发表于 2020-10-19 23:34
8楼9楼两位前辈 你俩说的正相反啊 呃。。。。。。。。

没有相反,变量与case1,2...依次比较,直到相符,就执行里面的语句,然后break跳出,后面的就不执行了。而if...else if...要依赖前面的条件约束。感觉switch这种和只是多个if不加else是一样的,但是这样写多个if语句明显不如switch语句来的简洁明了。
回复

使用道具 举报

ID:409831 发表于 2020-10-27 09:21 | 显示全部楼层
一般范围判断多用if,精确值用switch。   单个的精确值用IF==
回复

使用道具 举报

ID:835191 发表于 2020-10-27 15:10 | 显示全部楼层
同意8楼9楼
回复

使用道具 举报

ID:828160 发表于 2020-10-27 21:17 | 显示全部楼层
仿真一下就知道了,看汇编指令,我记得应该是直接跳转的,好像是ADDPC这条指令
回复

使用道具 举报

ID:835687 发表于 2020-10-28 16:10 | 显示全部楼层
按顺序查找,不符合就下一条case,一直不符合就最后一行default
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表