switch…case這個條件判斷的用法,就如同他的名字一樣的直覺。
switch,中文有切換的意思,而case則有案例的意思。它的運作原理跟 if 非常相似,不過在程式中,閱讀起來有時比if來得簡單也更容易懂,尤其當判斷的結果需要很多種變化時,switch…case就是個不錯用的流程控制語法。
這是一個簡單的switch…case例子:
(來源:Cherng)
不對,這個才是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
char c = 'A'; switch(c) { case 'A': printf("A\n"); break; case 'B': printf("B\n"); break; case 'C': printf("C\n"); break; case 'D': printf("D\n"); break; default: printf("\n"); } |
等效於 if 的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
char c = 'A'; if(c == 'A') { printf("A\n"); } else if(c == 'B') { printf("B\n"); } else if(c == 'C') { printf("C\n"); } else if(c == 'D') { printf("D\n"); } else { printf("\n"); } |
運作結果:你可以自己試試看~
如何?同樣的結果,但用 switch…case 寫的程式是不是比較容易理解呢?至少不會一堆符號參雜在一起,導致閱讀跟理解上也亂七八糟的參在一起這樣。啊..什麼?看不懂嗎?我想說我這次就BJ4,直接在這裡做個Ending,然後我就可以繼續放著長草了說…(大誤)
好吧,先來看看switch(c)這個奇怪的東西。
switch所做的其實就是一個判斷,他會去把括號裡面的東西跟底下case後接的東西做比對跟判斷,如果結果相符,那就執行那個case。執行到break後離開switch,然後繼續往下執行。
「蛤?你在說啥,可以說中文嗎?」
可以。
這樣好了。有天你在寫一張選擇題考券,看完題目後,你在下面的四個選項中猜答案。最後,你覺得答案是A,所以就在題號前的括號(或答案卡)填上A,然後結束這個題目,繼續向下看。
如果你腦筋動得快,我相信你應該已經稍稍的發現,這個敘述與上面的程式碼長得非常相似。還是不懂沒關係,我稍稍的分析一下給你聽。
當你在看完考卷題目時,就像是在生出switch…case這樣的一段程式碼一樣。
然後開始選,要哪個答案比較好。最後決定A答案最好,而這部分其實是在決定 c 的內容。在範例中雖然我是寫死的…不過別這樣,想像那是可以改的 XD 為了要寫下答案A,所以我們的頭腦找(switch)出了寫的方式(case ‘A’),然後命令手執行這個動作(printf(“A\n”)),這樣就是一個大概的 switch…case運作方式。
「default哩?你怎沒講?」
default是預設的動作,也就是說,假如今天ABCD都不是想要的答案,或是今天奇摩子差,不想寫,那就是執行這個動作了。
換個說法就是,當 c 變數不是ABCD其中之一時,便會執行 default 著個案例的內容。 要注意的是,每個 case 的結尾處一定要放上 break;
不然程式會繼續向下執行,直到switch的最後一行為止。像這個範例就是。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
char c = 'B'; switch(c) { case 'A': printf("A\n"); case 'B': printf("B\n"); case 'C': printf("C\n"); case 'D': printf("D\n"); default: printf("\n"); } /* 這會印出 B C D */ |
還有,當default不是最後一個的時候,也要放上break;不然結果就是…恩。
好了,距離先前發的系列文,這篇文章至少隔了近一年又七個月(驚),希望這篇文章能帶給你一些幫忙囉~
一開始我看到 break 這個功能我覺得感覺很多餘
不過之後我看到有人應用沒有 break 會繼續往下讀這點的功能來計算日數
我覺得還滿出乎我的意料之外,當初完全沒想到可以這樣應用這點
可能我學的還太淺了
我也沒看過這用法耶,是計算什麼樣的日數?
switch(month){
case 12: date += 30;
case 11: date += 31;
case 10: date += 30;
.
.
.
break;
}
會自動連加,也是有直接先加好每個月分的(一月到那個月的日數)
不過我還是覺得這種寫法讓我驚豔了 haha