1. 程式人生 > >c/c++排坑(3) -- c/c++中的switch語句

c/c++排坑(3) -- c/c++中的switch語句

switch語句的簡單介紹

一個 switch 語句允許測試一個變數等於多個值時的情況。每個值稱為一個 case,且被測試的變數會對每個 switch case 進行檢查。

switch(expression){
    case constant-expression  :
       f1();
       break; // 可選的
    case constant-expression  :
       f2();
       break; // 可選的
  
    // 您可以有任意數量的 case 語句
    default : // 可選的
       f
(); }

這玩意兒其實就是為了代替多種情況下if… else if…的這種巢狀。看上去很簡單對不對,但是新手總會在這裡遇到麻煩:

  • constant-expression必須是一個常量或字面量。const關鍵字並不真正表示常量,它只是標識這個變數不可變,其實更接近readonly的含義。比如寫成下面的程式碼就會報錯:
const int second = 2;
switch(i) { 
	case 1: f1();
	case second: f2();		//因為second並不是真正的常量,所以這裡會報錯
}
  • 上面的程式碼還有另外的隱患:一是f1()函式執行之後沒有加break語句,不加break語句就會繼續執行後面的f2。當然也有可能為了特殊設計就是為了執行f1然後執行f2這種邏輯。但是在絕大多數情況下,沒加break都意味著錯誤。第二點是沒加default語句。一般建議加一下,這樣來保證預設情況。
  • break有時候會誤用。來猜猜下面的程式碼會執行什麼:
#include <iostream>
#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))
using namespace std;
int array[] = {1,2,3,4,5,6,7,8,9};

int main()
{
	char c = 'a';
	char ci = c;
	int i = 0;
	bool Jump_out_of_if = true;
	switch(ci){
		case 'a':
			if(true){
				while
(i<9){ cout << array[i] << endl; ++i; break; } if(Jump_out_of_if) break; while(i<9){ cout << array[i] << endl; ++i; break; } cout << "未跳出if" << endl; } //程式碼原來的意思是想跳出外層if cout << "成功跳出了if" << endl; break; case 'b': cout << "not output" << endl; break; default: cout << "do nothing" << endl; } }

在給出結果之前,我們先來分析下這段程式碼。這段程式碼裡case 'a’裡有幾處都有break語句,一是while迴圈裡有break語句,二是if語句裡有break語句,三是case語句有也break語句。看看下圖的結果。再分析下原始碼,首先while迴圈的break會跳出迴圈,if語句的break會直接跳出case ‘a’,因為if裡面沒有break這一說法。所以後面的cout << “成功跳出了if” << endl 不會執行,所以結果是隻列印了一個1。
switch break

最後還是不得不吐槽這switch語句的break也太不人性化了,為了極少數情況,不得不再每個case後加break!!!

See you next time. Happy Coding!!!
我的github