在switch语句中将多个案例组合在一起

时间:2019-02-12 16:21:01

标签: c++

以下是我的switch语句代码:

 switch(pin)
  {
  case 1:
    break;
  case 2:   case 3:  case 4:  case 5:  case 6:  case 7:  case 8:  case 9:  case 10:  case 11:
  case 12:  case 13:  case 14:  case 15:  case 16:  case 17:  case 18:  case 19:  case 20:
  case 21:  case 22:  case 23: case 24:case 25:case 26:case 27:case 28:case 29: case 30: case 31:
  case 32: case 33: case 34: case 35:

    dataOut[pin-2] = 1;
    DAQmxWriteDigitalLines(taskHandleOut,1,1,10.0,DAQmx_Val_GroupByChannel,dataOut,NULL,NULL);

    break;

  default:
    break;

在上面,将情况2-35分组在一起,我的意思是,当pin等于2-35时,要执行特定的任务。

我想知道上面的代码是否有效。我还没有在switch语句中看到大小写分组。对于类似的多案例分组的任何Web链接表示赞赏。也许有一些更好的方法来代替对多个案例进行分组。

5 个答案:

答案 0 :(得分:4)

是的,虽然我会写,但这绝对没问题

if (pin >= 2 && pin <= 35){
    dataOut[pin-2] = 1;
    DAQmxWriteDigitalLines( ...
}

如果我是你。如果仅将gcc用作编译器,则也可以使用case ranges

答案 1 :(得分:4)

使用if-check if (pin >= 2 && pin <= 35)可以更好地处理您的案件,但 通常将案件标签分组。

gcc / clang / tinycc甚至带有语法糖:

switch(pin){
case 2 ... 35: /*nonstandard GNU extension; note well the whitespace*/
};

答案 2 :(得分:3)

有效。这称为 fallthrough ,这就是您必须将break分开case的原因。也就是说,如果您不break,则无论如何都将执行案件之后的指令。喜欢

int i = 1;
switch(i) {
    case 1:
        cout<<1<<endl;
    case 2:
        cout<<"nope!\n";
}

这将输出

1
nope!

因为break之前没有case 2:

但您也可以这样做

if (pin >= 2 && pin <= 35) {
    dataOut[pin-2] = 1;
    DAQmxWriteDigitalLines(taskHandleOut,1,1,10.0,DAQmx_Val_GroupByChannel,dataOut,NULL,NULL);
}

答案 3 :(得分:2)

是的,可以。 C ++为switch用例语句提供了 fall-through 。因此,除非您在break;的末尾提供case:,否则控制掉线到下一种情况,使您可以完全按照开关的描述进行操作。一些编译器允许简写形式一次描述多个case语句,但是对于可移植的C ++,只需提供每个不包含break;的case,例如

switch(pin)
{
    case 1:
        break;
    case  2: case  3: case  4: case  5: case  6: case  7: case  8: case  9: 
    case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17: 
    case 18: case 19: case 20: case 21: case 22: case 23: case 24: case 25: 
    case 26: case 27: case 28: case 29: case 30: case 31: case 32: case 33: 
    case 34: case 35:
        /* do what you need with pins 2 - 35 */
        dataOut[pin-2] = 1;
        DAQmxWriteDigitalLines (taskHandleOut, 1, 1, 10. 0, 
                            DAQmx_Val_GroupByChannel, dataOut, NULL, NULL);
        break;
    default:
        break;
}

现在,任何情况下,2-35都将执行您想要的语句:

        dataOut[pin-2] = 1;
        DAQmxWriteDigitalLines (taskHandleOut, 1, 1, 10. 0, 
                            DAQmx_Val_GroupByChannel, dataOut, NULL, NULL);

答案 4 :(得分:-1)

这是有效的代码,但是我宁愿在您的情况下使用default,特别是当您计划在其他情况下使用其他数字时。 default将与if / else语句中的else一样使用。如果没有指定大小写,则将为每个号码调用默认值。