1. 程式人生 > >Switch中的default陷阱

Switch中的default陷阱

當年學C語言switch開關語句的時候,很多人會告訴你它是這麼用的:

  1. switch(表示式){

  2. case常量表達式1: 語句1;break;

  3. case常量表達式2: 語句2;break;

  4. case常量表達式n: 語句n;break;

  5. default: 語句n+1;break;

  6. 其語義是:計算表示式的值。並逐個與其後的常量表達式值相比較,當表示式的值與某個常量表達式的值相等時,即執行其後的語句,然後不再進行判斷,繼續執行後面所有case後的語句。如表示式的值與所有case後的常量表達式均不相同時,則執行default後的語句。

很多人當時都是這麼理解的吧。

好,我們來看這樣一個程式

  1. #include <stdio.h>

  2. int main()

  3. {

  4. int c= 0, k;

  5. for (k = 1; k < 3; k++)

  6. switch (k)

  7. {

  8. default:c += k;

  9. case 2:

  10. c++; break;

  11. case 4:

  12. c += 2; break;

  13. }

  14. printf("%d",c);

  15. return 0;

  16. }

你覺得答案會是多少?

答案是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之後加

break語句,不過這種default用法是不推薦的,default顧名思義是預設情況,只有任何條件都不匹配的情況下才會執行,所以應該將default語句放在所有case結束之後

//輸入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;
}