前两天朋友问我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一起使用。