2010-08-24 50 views

回答

0

假設你有一個枚舉

enum expr_type { 
    EXPR_TYPE_ADD, 
    EXPR_TYPE_SUBTRACT, 
    EXPR_TYPE_GET_VALUE 
}; 

我們可以做這個開關:

enum expr_type t = /* get input somehow and find the type */; 

switch(t) { 
    case EXPR_TYPE_ADD: 
     cout << "Operator Add"; 
     /* fall through */ 
    case EXPR_TYPE_SUBTRACT: 
     cout << "Operator (Add or Subtract)"; 
     break; 
    case EXPR_TYPE_GET_VALUE; 
     cout << "Getting some value"; 
     break; 
} 

你必須把突破;所以它不會貫穿 - 目前,EXPR_TYPE_ADD將exponute EXPR_TYPE_SUBTRACT的所有代碼。確保正確使用break

1

這是一個相當典型的用例。你有一個值列表(枚舉)和一個開關,它檢查輸入以確定你正在處理的是哪一個。這當然假定您將採取的操作取決於枚舉的基礎值。

enum ImageFormat 
{ 
    FormatRGB888, 
    FormatRGB8888, 
    FormatRGB101010, 
    FormatRGB161616, 
    FormatRGB16161616 
}; 

void SomeFunc(ImageFormat format) 
{ 
    switch(format) 
    { 
     case FormatRGB888: 
      // do stuff 
      break; 
     case FormatRGB8888: 
      // do stuff 
      break; 
     case FormatRGB101010, 
      // do stuff 
      break; 
     case FormatRGB161616: 
      // do stuff 
      break; 
     case FormatRGB16161616: 
      // do stuff 
      break; 
     default: 
      // bad value for 'format' 
    } 
} 
+0

謝謝你。所以basicallt它可以增加更多,如果的和別人的然後。 – 2010-08-24 16:12:26

+0

那麼,你總是可以使用if/else if,但是開關給你1.恆定的查找時間和2.如果需要的話可以通過(儘管#2在你意外掉線時可能會有問題) – 2010-08-24 16:39:03

2

有幾件事情要記住開關case語句:

一)條件應該是integeral /枚舉/用戶定義類型支持轉換到int或枚舉

b)中的情況下標貼是編譯時間常數

c)中沒有兩個標籤的情況下的表達式可以具有相同的值

d)$ 6.4.2/5-「當開關S執行評分,評估其狀況,並與每種情況進行比較。如果其中一個案例常量等於條件的值,則控制權將傳遞給匹配案例標籤後面的語句。如果沒有大小寫常量與條件匹配,並且存在默認標籤,則控制權傳遞給由默認標籤標記的語句。如果沒有大小寫匹配,並且沒有默認值,那麼交換機中沒有任何語句執行。「

e)$ 6.4.2/6-」情況和默認標籤本身不會改變控制流,繼續暢通無阻地穿過這些標籤。爲了從交換機退出,看到破發」

enum direction {north, south, east, west}; 
char x; 
class UD{ 
    operator int(){return 0;} 
}; 

direction f1(){ 
    return north; 
} 

char f2(){ 
    return 'A'; 
} 

int main(){ 
    direction d = f(); 
    string country; 

    // switch condition of type enum 
    switch(d){ 
    case north: 
     country = "P"; 
     break; 
    case south: 
     country = "Q"; 
     break; 
    case east: 
     country = "R"; 
     break; 
    case west: 
     country = "S"; 
     break; 
    default: 
     country = ""; 
     break; 
    } 

    // switch condition of integral type 
    switch(c){ 
    case 'A': 
    case 'E': 
    case 'I': 
    case 'O': 
    case 'U': 
     cout << "Vowel"; 
     break; 
    default: 
     cout << "Not a Vowel"; 
     break; 
    } 

    UD u; 

    // switch condition of user defined type (conversion to integral type) 
    switch(u){ 
    case 0: 
    case 1: 
     cout << "Good"; 
     break; 
    default: 
     cout << "Not so good"; 
     break; 
    } 
} 
0

開關語句是做了很多的IFS的一個更有效的方式和別人的。