在 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;
}
使用如下所示的内容,但对于 B、C 和 D 输入,输出不会停留在0x08:
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。有可能吗?谢谢!
显然不需要重新排列原始代码,但肯定是可能的:
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;
}
只是另一种方式,它更清楚地表明某些情况的行为与其他情况不同:
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;
}
开关盒就像一个失败。在第一个case
匹配之后,将执行所有 subsequest case
语句,直到遇到 break
语句。
假设input == 'C'
,在这种情况下,首先data
将被设置为 0x04
然后在没有 break 语句的情况下,数据将被重新分配给 0x08
以进行D
(落在所有 case 语句中(。
基本上,对于输入B
,C
和D
数据将设置为 0x08
。这对于B
和C
您希望使用不同值的情况是不正确的data
我希望这不是您想要的原始案例。