GNU案例范围扩展允许在switch语句中使用case范围:
switch (value) {
case 1 ... 8:
printf("Hello, 1 to 8\n");
break;
default:
printf("Hello, default\n");
break;
}
您如何将其转换为标准C(c99或c89)?添加单个案例陈述?
编辑:你如何具体处理非常大的switch语句?
答案 0 :(得分: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;
}
编辑:回答评论 如果您的案例太多,那么您可能需要考虑将 switch-case 替换为 if-else 结构。它可以更清洁,简洁和可读。
if (value >=1 && value <= 8)
{
printf("Hello, 1 to 8\n");
}
else
{
printf("Hello, default\n");
}
答案 1 :(得分:3)
我会使用if
声明:
if (value >=1 && value <= 8) {
printf("Hello, 1 to 8\n");
} else {
printf("Hello, default\n");
}
如果需要更多范围,则可以添加额外的else if
语句,
答案 2 :(得分:2)
如果长距离可以做,有点脏,但是,
switch(what) {
case 1:
/* do 1 */
break;
case 2:
/* do 2 */
break;
default:
if (what > 31 && what < 127) {
/* do 32 to 126 */
}
}
最好可能是为了一起删除所有的开关。
对嵌套非常严格。如果你想要开关,出于某种原因,那么上面的更好的是:
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 :(得分: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语句基本相同。