Switch中的default陷阱
當年學C語言switch開關語句的時候,很多人會告訴你它是這麼用的:
-
switch(表示式){
-
case常量表達式1: 語句1;break;
-
case常量表達式2: 語句2;break;
-
…
-
case常量表達式n: 語句n;break;
-
default: 語句n+1;break;
-
其語義是:計算表示式的值。並逐個與其後的常量表達式值相比較,當表示式的值與某個常量表達式的值相等時,即執行其後的語句,然後不再進行判斷,繼續執行後面所有case後的語句。如表示式的值與所有case後的常量表達式均不相同時,則執行default後的語句。
很多人當時都是這麼理解的吧。
好,我們來看這樣一個程式
-
#include <stdio.h>
-
int main()
-
{
-
int c= 0, k;
-
for (k = 1; k < 3; k++)
-
switch (k)
-
{
-
default:c += k;
-
case 2:
-
c++; break;
-
case 4:
-
c += 2; break;
-
}
-
printf("%d",c);
-
return 0;
-
}
你覺得答案會是多少?
答案是3。
分析一下這個題目,首先看上去第一眼就很怪,怎麼把default放在第一句了。那麼程式是怎麼執行的呢?
當k=1的時候,c+=k ——>c=1 這個時候要注意了,default後面並沒有break,所以並不會跳出去,會執行case2,c++
——>c=2,遇到break,跳出。
當k=2的時候,執行case2 ,c++——>c=3;遇到break,跳出。
所以這裡總結一下default的用法:
如果default語句在所有case最後,此時可以不加break 如果default語句之後還有case語句,如果不加break,則default語句執行過之後會繼續下面的case語句,此時必須要在default之後加
//輸入china#,打印出5,6
#include <stdio.h>
int main()
{
int v1=0,v2=0;
char ch='\0';
do
{
switch(ch)
{
case 'a':;
case 'h':;
default:v1++;
case 'n':v2++;
}
}
while((ch=getchar())!='#');
printf("%d,%d",v1,v2);
return 0;
}