我正在处理一个相当大的枚举,它在概念上可以划分为代表四个不同的类别。目前我在switch case语句中使用此枚举,以便将值映射到四个单独的数组(与四个不同的类别一致)。
我很好奇的是,如果可以在switch case语句中的任意情况之后更改本地定义的变量。这将允许将switch语句分成这四个不同部分的能力,并且对于每种情况可能发生的值赋值 - 如果等效 - 可以在这些部分发生。
我想要的简化示例如下:
设置
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;
}
功能上的好处显然是nill,但是我很好奇这个功能是否存在于C中,或者是否有更好的方法来执行它。
谢谢!
答案 0 :(得分:3)
Switch语句只执行一个分支,所以你不能像这样跳转到交换机内部。但是你可以做的是将某些案例组合在一起,而不是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;
答案 1 :(得分:1)
一,不。
二,只使用ifs和elses。俗话说,当你拿锤子时,一切看起来像钉子。尝试应用于所有事情,switch
是一个非常奇怪的“锤子”。
三,嗯,我想你可以在任何地方使用goto
,但我们认为这是一个坏主意,并在80年代创造了可怕的代码混乱。
答案 2 :(得分: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;
}