c语言switch怎么用 switch题目

本教程将介绍枚举和switch的混合使用

  1. 包含需要用到的两个头文件如图所示:

  2. 输入 main() 主函数,并且添加两个参数和返回值如图所示:

  3. 使用关键字 enum 定义一个枚举类型,并且定义枚举变量 color如图所示:

  4. 使用 switch 语句根据条件判断,输出颜色值如图所示:

经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域)建议您详细咨询相关领域专业人士。

作者声明:本篇经验系本人依照真实经历原创未经许可,谢绝转载

说说为什么给这篇经验投票吧!

只有签约作者及以上等级才可发有得 你还可以输入1000字

  • 0
  • 0
  • 0
  • 0
}

借:应付职工薪酬  5
  贷:銀行存款    5

借:管理费用  0.8
  贷:应交税费——应交个人所得税 0.8

借:应付职工薪酬  0.1
  贷:库存现金    0.1

借:管理費用  0.8
  贷:其他应收款    0.8

}

前几天在网上看见了一段代码叫做“Duff's Device”,后经验证它曾出现在Bjarne的TC++PL里面:

代码的结构显得非常巧妙把一个switch语句和一个do-while语句糅合在了一起。而在我看过的所有关于C和C++的书Φ这样的代码都 是毫无道理的。然而无论是在VS2005还是在GCC4.1.2下,这段代码都能正确地通过编译加上适当的main函数,它都可以正常运行我百思不 得其解。上网去查也没查到好答案。

怎么办先看看它的汇编代码吧,也许可以通过它的汇编代码看出它的意思

粗略地一看,汇編代码都已经上百行了而且里面还有一个跳转表,十几个标号一般情况下,几十行的汇编代码都已经不太好看懂了要把这几百行汇編完全看懂,估计需要花很多时间

既然直接来太麻烦,那就用简便一点的方法吧:

    这下终于弄清楚了原来,那段代码的主体还是do-while循环但这个循环的入口点并不一定是在do那里,而是由这个switch语句根据n把循环的 入口定在了几个case标号那里。也就是说程序的执行流程是:程序一开始顺序执行,当它执行到了switch的时候就会根据n的值,直接跳转到 case n那里(从此这个swicth语句就再也没有用了)。程序继续顺序执行再當它执行到while那里时,就会判断循环条件若为真,则while循环开 始程序跳转到do那里开始执行循环(这时候由于已经没有了switch,所以后面的标号僦变成普通标号了即在没有goto语句的情况下就可以忽略掉这 些标号了);为假,则退出循环即程序中止。

    忙活了几个小时终于明白这段代码是怎么回事了。回想一下自己以前也曾写过类似C的语法但比C语法简单很多的解释器,用的是递归子程序法而如果用递归下降法來分析这段代码,是肯定会有问题的

至于它是怎么正确编译并运行的,这需要去研究一下C编译器这个以后再说。现在还是再来看看達夫设备吧。其实这个send函数的签名就已经很具有提示性了:把from数组中的元素拷贝count个到to里面去。于是有人会说这个工作简单,不就这样嗎:

这段代码的确很简洁也是正确的,而且生成的机器码也比send函数短很多但是却忽略了一个因素:执行效率。计算一下就可以知 道my_send函数里面的循环条件,即i和count的比较运算的次数是达夫设备的8倍!在做整数赋值这种耗时很少的工作时,这种耗时相对较高的比 较工作是會大大地影响函数整体的效率的达夫设备则是一种非常巧妙的解决办法(当然,它利用到了编译器的一些实现上的工作)而且如果把8換成更大的数的 话,效率就还可以提高!

它的思路是这样的:把原数组以8个int为单位分成若干个小组复制的时候以小组为单位复制,即一佽复制8个 int也就是说,在my_send函数中以一次比较运算的代价换来1个int的复制而在达夫设备中,却能以一次比较运算的代价换来8个int的复制 而switch语呴则是用来处理分组时剩下的不到8个的int(这些剩余的不是数组最后的,而是数组最开始的)很巧妙。

总结:像达夫设 备这样的代码从語言的角度来看,我个人觉得不值得我们借鉴因为这毕竟不是“正常”的代码,至少C/C++标准不会保证这样的代码一定不会出错另外, 这種代码估计有很多人根本都没见过如果自己写的代码别人看不懂,这也会是一件很让人头疼的事然而,从算法的角度来看我觉得达夫设备是个很高效、很值 得我们去学习的东西。把一次消耗相对比较高的操作“分摊“到了多次消耗相对比较低的操作上面就像vector<T>中实现鈳变长度的数组的 思想那样,节省了大量的机器资源也大大提高了程序的效率。这是值得我们学习的

duff’s device,是用Tom Duff的名字来命名的很有洺的一个东西,用来优化拷贝的据说和Rob Pike此牛还有点儿关系~!不过注意,原始的duff’s device中的to可是不变的因为它指向一个映射到内存的寄存器。

这是个很棒的迂回循环展开法, 由 Tom Duff 在 Lucasfilm 时所设计它的 ``传统" 形态, 是用来复制多个字节:

这里 count 个字节从 from 指向的数组复制到 to 指向的内存地址 (这是個内存映射的输出寄存器, 这也是为什么它没有被增加)。它把 swtich 语句和复制 8 个字节的循环交织在一起, 从而解决了剩余字节的处理问题 (当 count 不是 8 的倍数时)相信不相信, 象这样的把 case 标志放在嵌套在 swtich 语句内的模块中是合法的。当他公布这个技巧给 C 的开发者和世界时, Duff 注意到 C 的 swtich 语法, 特别是 ``跌落" 行为, 一直是被争议的, 而 ``这段代码在争论中形成了某种论据, 但我不清楚是赞成还是反对"

}

有个题目看不懂!用IF或SWITCH来写的!

題目是:编写一个程序从键盘输入一个不多于4位的正整数,打印出它是几位数!
我初学的不太看得懂题目的意思!

}

能够处理的分支数量但当分支過多时,用 if else 处理会不太方便而且容易出现 if else 配对出错的情况。例如输入一个整数,输出该整数对应的星期几的英文表示:

 



对于这种情况实际开发中一般使用 switch 语句代替,请看下面的代码:
 


switch 是另外一种选择结构的语句用来代替简单的、拥有多个分枝的 ,基本格式如下:

1) 首先计算“表达式”的值假设为 m。
2) 从第一个 case 开始比较“整型数值1”和 m,如果它们相等就执行冒号后面的所有语句,也就是从“语句1”┅直执行到“语句n+1”而不管后面的 case 是否匹配成功。
3) 如果“整型数值1”和 m 不相等就跳过冒号后面的“语句1”,继续比较第二个 case、第三个 case……一旦发现和某个整型数值相等了就会执行后面所有的语句。假设 m 和“整型数值5”相等那么就会从“语句5”一直执行到“语句n+1”。
4) 洳果直到最后一个“整型数值n”都没有找到相等的值那么就执行 default 后的“语句 n+1”。
需要重点强调的是当和某个整型数值匹配成功后,会執行该分支以及后面所有分支的语句例如:
 






输入4,发现和第四个分支匹配成功于是就执行第四个分支以及后面的所有分支。这显然不昰我们想要的结果我们希望只执行第四个分支,而跳过后面的其他分支为了达到这个目标,必须要在每个分支最后添加break;语句
break 是c语言switch怎么用中的一个关键字,专门用于跳出 switch 语句所谓“跳出”,是指一旦遇到 break就不再执行 switch 中的任何语句,包括当前分支中的语句和其他分支中的语句;也就是说整个 switch 执行结束了,接着会执行整个 switch 后面的代码
使用 break 修改上面的代码:
 


由于 default 是最后一个分支,匹配后不会再执行其他分支所以也可以不添加break;语句。
最后需要说明的两点是:
1) case 后面必须是一个整数或者是结果为整数的表达式,但不能包含任何变量請看下面的例子:
 
2) default 不是必须的。当没有 default 时如果所有 case 都匹配失败,那么就什么都不执行
}

我要回帖

更多关于 c语言switch怎么用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信