具有重叠操作的Switch中的多个案例

时间:2017-02-13 06:33:30

标签: c switch-statement

在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。可能吗? 谢谢!

3 个答案:

答案 0 :(得分:4)

没有明显需要重新安排原始代码,但肯定有可能:

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;
}

答案 1 :(得分:1)

另一种方式,更清楚地表明某些案例的行为与其他案件不同:

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;
}

答案 2 :(得分:0)

switch-case就像一场堕落。在第一次case匹配后,将执行所有子请求case语句,直到遇到break语句。

假设input == 'C',在这种情况下,首先data将设置为0x04,然后在没有break语句的情况下,数据将被重新分配给0x08 { {1}}(通过所有案例陈述)。

基本上,对于输入DBC数据将设置为D。对于您需要0x08

的不同值的BC情况,这是不正确的

我希望根据你原来的情况,这不是你想要的。