1. 程式人生 > >C語言關鍵字淺析-case

C語言關鍵字淺析-case

### C語言關鍵字淺析系列 ###

### ISO/ANSI C 關鍵字 ###

case語句是C語言中switch開關語句中常用的關鍵字

將switch語句後的小括號中的變數視為引數

如果下面某一個case後跟的常量與引數相同

則從該case後的程式碼開始執行

 

case的作用:

標記switch選擇結構中程式開始執行的位置。

 

對比if-else關鍵字,case關鍵字的一大優勢是可以按“開關”的思想控制語句開始執行的位置。

但case的一個劣勢是,case後的引數需要是int或者char常量,不能是表示式,而if-else可以根據表示式結果判斷執行。

/*
	轉換地址,不區分大小寫
*/
int alterAddress(char c)
{
	int add;
	switch(c)
	{
		case 'a':   /* 如果引數c是'a',程式從此處開始執行 */
		case 'A':   /* 如果引數c是'A',程式從此處開始執行 */
			add = 0x11;
			break;  /* 為了遮蔽其他選項,發揮switch的選擇功能,一類處理的最後要寫上break跳過後面的執行語句 */
		case 'b':
		case 'B':
			add = 0x12;
			break;
		case 'c':
		case 'C':
			add = 0x13;
			        /* 此處有bug,沒有break會導致後面的語句繼續執行,也許會造成程式結果錯誤 */
		case 'd':
		case 'D':
			add = 0x14;
		default:
			add = 0x01;		
	}

        return add;
}

 

case語句和if-else語句的另一個不同之處在於,case語句都在同一個作用域,case後定義變數可能會出錯,比如下面這個例子:

int j;
switch(c)
{
	case 'a':
		int i;   /* 這裡編譯器可能會報錯,因為所有的case在一個作用域,這個i在所有case都可見 */
		i = 0;
	case 'b':
	case 'c':
		j = 2;
		break;
}

解決方案是,用一個{}在case後巢狀一個程式碼塊,強行做一個作用域:

int j;
switch(c)
{
	case 'a':
        {
		int i;   /* 用大括號圍成一個程式碼塊,i的作用域就限定在了該程式碼塊內 */
		i = 0;
        }
	case 'b':
	case 'c':
		j = 2;
		break;
}

 

——參考《C Primer Plus第五版》