1. 程式人生 > >淺談switch和if的細節

淺談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一起使用。