2012-03-29 25 views
7

GNU的情況下,範圍擴展允許的情況下在switch語句範圍:GNU的受案範圍擴展轉換爲標準C

switch (value) { 
    case 1 ... 8: 
     printf("Hello, 1 to 8\n"); 
     break; 
    default: 
     printf("Hello, default\n"); 
     break; 
} 

你會如何將其轉換爲標準C(C99,C89或)?添加個人案例陳述?

編輯:你將如何處理非常大的switch語句?

回答

7
switch(value) 
{ 
    case 1: 
    case 2: 
    case 3: 
    case 4: 
    case 5: 
    case 6: 
    case 7: 
    case 8: 
     printf("Hello, 1 to 8\n"); 
     break;  
    default:   
     printf("Hello, default\n");   
     break; 
} 

編輯:要回答的評論。
如果您的案例太多,那麼您可能需要考慮將開關盒替換爲if-else結構。它可以更清潔,簡潔&可讀。

if (value >=1 && value <= 8) 
{  
    printf("Hello, 1 to 8\n"); 
} 
else 
{ 
    printf("Hello, default\n"); 
} 
+2

我試圖更換一個案例32 ... 126::)這將是一個長開關聲明... – Ynv 2012-03-29 09:46:15

+0

有沒有辦法用C預處理器生成這些情況? – Ynv 2012-03-29 09:48:40

+0

@Ynv:您可能只想切換到使用一系列if-else語句。 – 2012-03-29 09:52:25

2

如果很長很長的範圍,你可以做,有點髒,但

switch(what) { 
case 1: 
    /* do 1 */ 
    break; 
case 2: 
    /* do 2 */ 
    break; 
default: 
    if (what > 31 && what < 127) { 
     /* do 32 to 126 */ 
    } 
} 

最好將 可能 是一個if一起刪除開關。

嵌套非常嚴格。如果你想要開關,出於某種原因,然後更好,那麼上述將是:

if (value > 31 && value < 127) { 
    /* Do something */ 
} else { 
    switch (value) { 
    case 1: 
     ... 
    } 
} 

Ach,抱歉再次編輯。 這個會更乾淨。

if (value > 31 && value < 127) { 
    /* Do something */ 
} else if (value > 127 && value < 178) { 

} else if (... 

} 

switch (value) { 
case 1: 
    ... 
} 
3

我會用一個if聲明:

if (value >=1 && value <= 8) { 
    printf("Hello, 1 to 8\n"); 
} else { 
    printf("Hello, default\n"); 
} 

然後,您可以添加額外的else if語句如果需要更多的範圍,

2

另外,因爲數字是彼此相鄰,你可以對開關盒進行手動優化。

typedef void(*func_t)(void); 

#define CASES_N 9 

void func0 (void) 
{ 
    printf("Hello, 0\n"); 
} 

void func1 (void) 
{ 
    printf("Hello, 1 to 8\n"); 
} 

static const func_t execute [CASES_N] = 
{ 
    &func0, 
    &func1, 
    &func1, 
    &func1, 
    &func1, 
    &func1, 
    &func1, 
    &func1, 
    &func1 
}; 

int main() 
{ 
    if(what < CASES_N) 
    { 
    execute[what](); 
    } 
    else 
    { 
    printf("Hello, default\n"); 
    } 
} 

該代碼與編譯器優化的switch-statement基本相同。