2015-11-20 54 views
1

我正在處理一個相當大的枚舉,它可以在概念上被劃分爲四個不同的類別。目前我在switch case語句中使用這個枚舉,以便將值映射到四個單獨的數組(符合四個不同的類別)。有沒有辦法改變局部變量中途通過switch case而不退出switch語句?

我很好奇的是,如果可以在switch case語句中的任意個案之後更改本地定義的變量。這將允許將開關語句分成這四個不同的部分,並且可以在這些部分發生針對每種情況發生的值賦值 - 如果相等的話。

一個簡單的例子就是我將用於如下:

設置

enum incidental_indexes { 
arr1_0, arr1_2, arr2_0, arr1_1, arr2_1 
} indexes; 

struct foobar{ 
int arr1[3]; 
int arr2[2]; 
} 

enum indexes unknown_index = ???; // In my code there are two separate indexes being mapped 
           // from one another, so for the sake of example imagine that 
           // this index is unknown 
enum indexes curr_index = arr1_1; //Value here does not matter 
struct foobar my_struc; 
int * curr_arr; 
int mapped_index; 

暴力方法

switch(unknown_index){ 
case(arr1_0): 
    curr_arr = my_struc.arr_1; //First category array 
    curr_index = arr1_0; 
    break; 
case(arr1_1): 
    curr_arr = my_struc.arr_1; //First category array, again 
    curr_index = arr1_1; 
    break; 
case(arr1_2): 
    curr_arr = my_struc.arr_1; //First category array, again, again 
    curr_index = arr1_2; 
    break; 
case(arr2_0): 
    curr_index = arr2_0; 
    curr_arr = my_struc.arr_2; //Second category array 
    break; 
case(arr2_1): 
    curr_index = arr2_1; 
    curr_arr = my_struc.arr_2; //.... 
    break; 
} 

理想路徑

switch(unknown_index){ 
default: //Notice no break. 
    curr_arr = my_struc.arr_1; //First category array 
case(arr1_0): 
    curr_index = arr1_0; 
    break; 
case(arr1_1): 
    curr_index = arr1_1; 
    break; 
case(arr1_2): 
    curr_index = arr1_2; 
    break; 
default: //Something like a second default, however disallowed 
    curr_arr = my_struc.arr_2; //Second category array 
case(arr2_0): 
    curr_index = arr2_0; 
    break; 
case(arr2_1): 
    curr_index = arr2_1; 
    break; 
} 

功能的好處顯然是不好的,但我很好奇,如果這個功能甚至存在於C,或者如果有可能是一個更好的方法來執行此操作。

謝謝!

+0

注:'case'標籤是沒有的功能,所以你不應該使用括號。 (對於'return',順便說一句。) – Olaf

+0

也許使用兩個'switch'es是更好的方法。不知道你實際上想用重新定義來完成什麼。 'case'標籤與'goto'類似,不像'if'語句鏈只需讓編譯器優化它即可。 – Olaf

+0

您的各種定義包括'arr'和'_'以及'number',根本不適合人類。編程語言應該是機器和人類思維之間的橋樑。你的'switch'聲明似乎是這三件事加上'curr'的混合模糊。 –

回答

3

開關語句只執行一個分支,所以你不能像這樣在開關內部跳轉。什麼,但是你可以做的是一羣某些情況下一起沒有break之間:

switch(curr_index){ 
case arr1_0: 
case arr1_1: 
case arr1_2: 
    curr_arr = my_struc.arr_1; 
    break; 
case arr2_0: 
case arr2_1: 
    curr_arr = my_struc.arr_2; 
    break; 
} 

編輯:

對於索引分配部分,你可以做一個第二switch這樣的:

switch(unknown_index){ 
case arr1_0: 
    curr_index = arr1_0; 
    break; 
case arr1_1: 
    curr_index = arr1_1; 
    break; 
case arr1_2: 
    curr_index = arr1_2; 
    break; 
case arr2_0: 
    curr_index = arr2_0; 
    break; 
case arr2_1: 
    curr_index = arr2_1; 
    break; 
} 

但是,由於您始終分配的值爲unknown_index,因此上述內容與此相同:

curr_index = unknown_index; 
+0

感謝您的回覆。我不確定你跳的是什麼意思。意識到你所建議的例子,但是除了與其分類相關的數組賦值之外,每個案例都有一個與之相關的特定分配(索引)。 當然,我也可以添加一些檢查,看看它是否已被分配,但在那一點上,它不會感覺遠離使用標誌。在那個時候,我個人傾向於使用幾個交換機。 – TolkienWASP

+0

@TolkienWASP請參閱我對編輯索引的編輯。 – dbush

+0

感謝dbush的後續工作,將任務分解爲幾個switch語句是我最初實現的,並且它似乎是處理我所要做的最好的方法。 – TolkienWASP

1

One,no。

二,只使用ifs和elses。俗話說,當你有錘子時,一切都看起來像釘子。 switch是一個非常奇怪的「錘子」,試圖應用於一切。我想你可以在任何地方都使用goto,但是我們認爲這是一個糟糕的主意,並在80年代創造了可怕的大量代碼。

0

在交換機中,您可以訪問所有本地定義的變量。我不太確定我明白你的問題......好像你正在試圖做的是最好的2個開關來實現的:

switch(unknown_index){ 
case(arr1_0): 
case(arr1_1): 
case(arr1_2): 
    curr_arr = my_struc.arr_1; //First category array, again, again 
    break; 
case(arr2_0): 
case(arr2_1): 
    curr_arr = my_struc.arr_2; //.... 
    break; 
} 
switch(unknown_index){ 
case(arr1_0): 
    curr_index = arr1_0; 
    break; 
case(arr1_1): 
    curr_index = arr1_1; 
    break; 
case(arr1_2): 
    curr_index = arr1_2; 
    break; 
case(arr2_0): 
    curr_index = arr2_0; 
    break; 
case(arr2_1): 
    curr_index = arr2_1; 
    break; 
}