繁体   English   中英

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

[英]Group multiple cases together in the switch statement

下面是我的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语句中看到案例分组。 任何类似的多个案例分组的网络链接都表示赞赏。 也许有更好的方法可以这样做,而不是分组多个案例。

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

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

如果我是你。 如果您只使用gcc作为编译器,那么您也可以使用案例范围

当你的情况下可以与如果检查得到更好的服务if (pin >= 2 && pin <= 35) 是很常见的组的情况下的标签这样的。

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

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

这是有效的。 它被称为fallthrough ,这就是你必须将break分开来分隔case的原因。 也就是说,如果你不break ,你的案件后面的指令将会被执行。

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

这将输出

1
nope!

因为在case 2:之前没有break case 2:

但在你的情况下你也可以这样做

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

是的你可以。 C ++为switch case语句提供了直通 除非你提供break; case:结束时case: ,控制落入下一个案例,允许您完全按照您使用开关描述的内容。 有些编译器允许一次性描述多个case语句,但对于便携式C ++,只需提供每个案例而不会break; 就是你所需要的一切,例如

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM