浅谈switch和if的细节

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值