找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1573|回复: 15
收起左侧

请教一个C语言switch语句的问题

[复制链接]
ID:47286 发表于 2022-2-19 22:58 | 显示全部楼层 |阅读模式
标准程序

case 1:
a=1;
b=0;
c=10
break;

case 2:
a=0;
b=1;
c=10;
break;

可见c=10是相同的 问题是 如何把相同的行只写一次 以前看过一位高人写过可我给忘了 而且 找不到那帖子了

我合并了一下是下面这样 结果都不对 也许就不行吧 可有点不死心啊 求高人给鉴定

case 1:
a=1;
b=0;

case 2:
a=0;
b=1;
c=10;

break;
回复

使用道具 举报

ID:625730 发表于 2022-2-19 23:17 | 显示全部楼层
break不能少,c=10要不写在swtich外面,要不也不要少。
回复

使用道具 举报

ID:47286 发表于 2022-2-19 23:31 | 显示全部楼层
TEC 发表于 2022-2-19 23:17
break不能少,c=10要不写在swtich外面,要不也不要少。

感谢回复先 你说的对 老老实实写就没问题 我是好奇switch语句有没有更牛的写法

假如是if语句 可以嵌套 那么一层里把需要归并的写前面就行 但switch语句里假如只有1和2允许修改c值的情况下 写前面会有问题吧
回复

使用道具 举报

ID:624769 发表于 2022-2-19 23:41 | 显示全部楼层
dzbj 发表于 2022-2-19 23:31
感谢回复先 你说的对 老老实实写就没问题 我是好奇switch语句有没有更牛的写法

假如是if语句 可以嵌套 ...

可以用 goto 但是,不合算,C=10;   要比goto 高效的多。
回复

使用道具 举报

ID:883242 发表于 2022-2-20 01:51 | 显示全部楼层
你的写法确实节约了程序的长度,但是运行时间反而变长了。贴出完整的switch代码,看看能优化到什么程度,你现在贴出来的代码如果是全部的话,在switch前面给c赋值就是最优解。
回复

使用道具 举报

ID:373388 发表于 2022-2-20 09:20 | 显示全部楼层
不清楚您的完整逻辑,表面看把c写在switch外面就可以,但仔细分析,从逻辑来看case 3的例外情况呢,所以没有优化的必要。
回复

使用道具 举报

ID:47286 发表于 2022-2-20 13:43 | 显示全部楼层
188610329 发表于 2022-2-19 23:41
可以用 goto 但是,不合算,C=10;   要比goto 高效的多。

感谢回复 从过去的交流得到经验 你在效率方面的评论毋庸置疑
回复

使用道具 举报

ID:47286 发表于 2022-2-20 13:53 | 显示全部楼层
Hephaestus 发表于 2022-2-20 01:51
你的写法确实节约了程序的长度,但是运行时间反而变长了。贴出完整的switch代码,看看能优化到什么程度,你 ...

感谢回复

这个问题本来没有啥完成函数 只是写程序半路突然冒出个想法 在没有完整思路的时候 你这也确实是最好的建议
回复

使用道具 举报

ID:47286 发表于 2022-2-20 13:56 | 显示全部楼层
xhaity 发表于 2022-2-20 09:20
不清楚您的完整逻辑,表面看把c写在switch外面就可以,但仔细分析,从逻辑来看case 3的例外情况呢,所以没 ...

感谢回复

目前看来 各位大佬的建议都是没必要
回复

使用道具 举报

ID:624769 发表于 2022-2-20 19:09 来自手机 | 显示全部楼层
dzbj 发表于 2022-2-20 13:43
感谢回复 从过去的交流得到经验 你在效率方面的评论毋庸置疑

keil c,在Switch的优化方面是做的比较好的,我曾经为了合并同类项,有过在Switch里面加goto这种很不c的做法,后来发现完全画蛇添足。你也是实干派,你可以做个实验,现在这个例子相同的只有一句,你如果想同的有3句以上,不管是内容还是排列顺序都一样的话,在编译时keil 会自动把他们合并,假定case 1和2有5句相同,2和3有4句相同,keil也会弄出一个最优合并方案,这个你简单写一下,编译后看一下编译后代码即可,虽然是汇编,但是简单的跳转应该不影响你阅读。当然有个前提,就是这里说的相同项,必须是从break开始往上倒数,完全一致的相同项,包括顺序。
回复

使用道具 举报

ID:47286 发表于 2022-2-20 20:51 | 显示全部楼层
188610329 发表于 2022-2-20 19:09
keil c,在Switch的优化方面是做的比较好的,我曾经为了合并同类项,有过在Switch里面加goto这种很不c的 ...

谢谢

一直对keil的优化摸不着头脑 优化等级里有一个就是重复语句尽量用一个 但使用中效果一般 你这么一提醒是个很好的启发 而且道理上讲得通 “当然有个前提,就是这里说的相同项,必须是从break开始往上倒数,完全一致的相同项,包括顺序。” 这句我觉得挺重点的
回复

使用道具 举报

ID:415064 发表于 2022-2-21 09:16 | 显示全部楼层
错了,这样最终结果当case1时,a=1,b=0,c=10      没啥特殊的技巧,老老实实写吧,可以定义个函数,这样修改C的时候,就不用哪儿都修改
回复

使用道具 举报

ID:47286 发表于 2022-2-21 09:43 | 显示全部楼层
wojiaoguogai 发表于 2022-2-21 09:16
错了,这样最终结果当case1时,a=1,b=0,c=10      没啥特殊的技巧,老老实实写吧,可以定义个函数,这样 ...

感谢回复 明白
回复

使用道具 举报

ID:434018 发表于 2022-2-21 14:59 | 显示全部楼层
switch (x)
{
c=10;
case 1:
           a=1;
           b=0;
break;

case 2:
        a=0;
        b=1;
break;
}
回复

使用道具 举报

ID:47286 发表于 2022-2-21 18:31 | 显示全部楼层

感谢你的回复

是我描述问题不够全面 有误导嫌疑 我想请教的是当不同分支里有相同指令又有不同指令时 能不能合并和怎么合并分支 因为我自己没想出来

你提供的回答是正确的 但有时候不能这么用 因为假如case1需要c=10 case2需要C=10 但case3分支里不允许修改c值时 这么写等于在case3时也把c变量改了

目前得到的大部分意见都是按规矩写
回复

使用道具 举报

ID:1003226 发表于 2022-2-23 10:35 | 显示全部楼层
break;执行完要跳出的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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