c - 交换机中具有重叠操作的多个案例



在 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 语句中(。

基本上,对于输入BCD数据将设置为 0x08 。这对于BC您希望使用不同值的情况是不正确的data

我希望这不是您想要的原始案例。

最新更新