2017-02-13 28 views
0

C中是否有任何方式通過不同的案例標籤,每個標籤都執行特定的操作和一些常用操作,而無需重寫常用操作? 我的意思是不是這樣的:開關重疊操作中的多個案例

switch(input) 
{ 
case A: 
//do nothing 
break; 
case B: 
data = 0x02; 
output = data; 
break; 
case C: 
data = 0x04; 
output = data; 
break; 
case D: 
data = 0x08; 
output = data; 
break; 
default: 
//do nothing 
break; 
} 

使用類似以下,但輸出不爲0x08的對於B卡,C和d輸入:

switch(input) 
{ 
case A: 
//do nothing 
break; 
case B: 
data = 0x02; //specific operation for B 
case C: 
data = 0x04; //specific operation for C 
case D: 
data = 0x08; //specific operation for D 
output = data; //common operation for all B,C,D labels 
default: 
//do nothing 
break; 
} 

我需要的,如果輸入B,C或D輸出隨後分配給0x02,0x04或0x08。它可能嗎? 謝謝!

+0

是的,有可能 - 使用「goto」。不管這是否可取也可能是另一回事...... –

+1

你的第一個版本是可讀的,可以理解的,它沒有任何問題。試圖用'switch'語句做聰明的技巧是容易出錯的,不值得保存幾行代碼。 – acraig5075

+0

@BJMyers我不想使用goto,但感謝您的建議 – 1chenar

回答

4

有沒有明顯需要重新安排的原代碼,但它肯定是可能的:

bool write_output = true; 

switch(input) 
{ 
    case B: data = 0x02; break; 
    case C: data = 0x04; break; 
    case D: data = 0x08; break; 

    case A: 
    default: 
    write_output = false; 
    break; 
} 

if(write_output) 
{ 
    output = data; 
} 
0

開關櫃的行爲就像是一次倒塌。在第一個case匹配之後,將會執行所有後續的case語句,直到遇到break語句。

假設input == 'C',在第一data將被設置爲0x04,然後在不存在break語句的這樣的情況下,數據將被重新分配給0x08D(下降通過所有的情況下,語句)。

基本上,對於輸入B,CD數據將被設置爲0x08。這將不正確的BC情況下,你想要一個不同的值data

我希望這不是你想要的,根據你原來的情況。

+0

是的,我不想那樣做。我試圖編寫一個類似原始代碼的代碼,但不會多次重寫公共操作。 – 1chenar

+0

正確。我希望你現在瞭解'switch-case'是如何工作的。第二個代碼重新安排不適合你。 – Rishi

1

只是另一種方式,這更清楚地表明,某些情況下,行爲不同於其他:

switch(input) { 
    case A: 
    //do nothing 
    break; 

    default: 
    switch (input) { 
     case B: data = 0x02; break; 
     case C: data = 0x04; break; 
     case D: data = 0x08; break; 
    } 
    output = data; 
}