浅谈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一起使用。

0 0
原创粉丝点击