浅谈switch和if的细节
来源:互联网 发布:网络与狗带是什么意思 编辑:程序博客网 时间:2024/06/11 19:36
前两天朋友问我switch语法的时候我在switch用法上有些含糊,今天写篇博文梳理一下,如有各路大神前来,给小弟指出,必虚心接受。
好了闲话不多说了,进入正题
我们先来看下这段错误代码:
#include < stdio.h >void main(){ double p = 0, w = 0; int flag = 0; scanf("%lf", &w); switch(w){ case (w > 0 && w <=50):printf("1"); break; case (50 < w && w <=100):printf("2"); break; case (w >100):printf("3"); break; defailt:printf("error"); }}
这段代码的错误在于switch case语句用法有问题,可能会被误认为case语句后是一个判断语句,当判断正确时则进入该条case语句中,事实上这是错误的,switch的用法实际上是判断表达式是否与case语句中的常量表达式相匹配,是常量表达式!!常量表达式!!常量表达式!!(比如常数或者单个字符)从第一条case进行核对,如果匹配的话则跳入该case语句中,然后执行完遇到break后则跳出switch语句,如果不匹配,则进入下一条case语句中,若到了最后一条case语句中还未能有匹配的常量表达式,则执行default中的语句;
switch(表达式){ case常量表达式1:语句1; case常量表达式2:语句2; .... case常量表达式k:语句k;default:语句;}
就拿开始那个错误代码为例进行正确代码改写如下:
#include < stdio.h >void main(){ double p = 0, w = 0; int flag = 0; scanf("%lf", &w); if(0 < w && 50>= w) flag = 1; else if(50 < w &&100 >= w) flag = 2; else if(100 < w) flag = 3; switch(flag){ case1:printf("1"); break; case2:printf("2"); break; case3:printf("3"); break; default:printf("error"); }}
改写以后就可以根据范围判断flag的值从而在switch中进行判断输出1,2,3.
C语言中switch语句既有它的优势所在,也有它的弱点所在。说它有弱点所在,是因为程序员很容易会遗漏各个case部分的break语句和case后面跟常量表达式这一特点,造成一些难以理解的程序行为。同样,说它有优势所在是因为如果程序员有意略取一个break语句,则可以表达出一些采用其他方式很难方便加以实现的程序控制结构。
还要注意的细节就是最后改写后的代码中的if条件。if语句中变量与常量值进行比较判断时,要将常量值设置为左值,因为此时如果你将==写成=时,编译会报错说常数赋值不能成为左值,然后你就可以很快速的找到错误并且修改掉。而正常情况下当左边为变量右边为常量值时,如果将==写成=的话,编译器不一定会报错,但是代码怎么都运行不成功,然后会浪费你很长的时间去找这个很细微的错误,浪费你的时间。所以在if语句判断条件那里尽量将常量值放在左侧,养成这样的习惯可以减少很多不必要的麻烦。
补充:break和continue的区别在哪里呢?
break表示终止循环的执行;continue表示终止本次循环体,进入下一次循环执行。switch只能配合使用break,不能使用continue,continue是进入下一次循环,然而switch并不能循环,这与C语言本身设定相矛盾,所以switch无法与continue一起使用。
- 浅谈switch和if的细节
- 浅谈if和switch语句
- if和switch的应用
- if和switch的区别
- IF和SWITCH的原理
- if和switch的区别
- if 和 switch的区别和应用
- if-else和switch的效率问题
- if else 和 switch的效率
- if else 和switch 的区别
- 关于Switch和If的速度问题
- switch 和 if else的效率区别
- switch和if判断的个人理解
- day3 if else 和switch的学习
- if语句和switch语句的区别
- java基础--if和switch的区别
- if else 和 switch 的区别
- If()语句 和 switch()语句 的 比较
- 日志组件commons-logging和log4j(三)
- 最长上升子序列
- python实现文件夹名/文件名/文件内容的关键字替换
- JavaScript 中数组的 splice() 方法
- 第九周
- 浅谈switch和if的细节
- L2-010. 排座位
- 史上最简单的Hibernate入门简介
- Mysql学习笔记七——limit 用法
- 《手把手教你学C语言》学习笔记(4)---代码规范
- 上升子序列
- C#颜色合成器
- JNI编程基础(一)
- hdu 2055 An easy problem