'switch'在 C/C++ 中有哪些有趣的用途?

What are some interesting uses of 'switch' in C/C++?

本文关键字:switch C++      更新时间:2023-10-16

C/c++中的switch语句有一个有趣的特性,如果满足条件

将执行所有后续块例如,

int a = 2;
int b = a;
switch(b)
{
     case 1:cout<<1;
     case 2:cout<<2;
     case 3:cout<<3;
     case 4:cout<<4;
};

上面的代码将输出234,除非我在case 2中加入break语句。

在我3年的C/c++编程经验中(相当短,是的),我从来没有遇到过这样的问题:我必须使用switch而不在每个case中放置break语句。但从这个功能被搁置了这么长时间的事实来看,它可能有一些实用价值。

问题:在C/c++中,switch语句有哪些巧妙的用法来利用上面提到的特性?

可能是我见过的最有趣的用例之一是Duff's Device,在这种情况下,您在开关中扩展了多个用例,它看起来像这样:

void send( int *to, const int *from, int  count)
{
        int n = (count + 7) / 8;
        switch(count % 8) 
        {
            case 0: do {    *to = *from++;   // <- Scope start
            case 7:         *to = *from++;
            case 6:         *to = *from++;
            case 5:         *to = *from++;
            case 4:         *to = *from++;
            case 3:         *to = *from++;
            case 2:         *to = *from++;
            case 1:         *to = *from++;
                        } while(--n > 0);    // <- Scope end
        }
}

通常在您想要对一组值应用类似操作时使用。例如:

switch (event) {
   case DEVICE_DISCONNECTED:
   case CONNECTION_ERROR:
   case CONNECTION_TIMEOUT:
     transitionTo(disconnectedState);
     break;
   case CONNECTION_SUCCESS:
     transitionTo(connectedState);
     break;
}
在我看来,

更简洁易读。
switch (event) {
   case DEVICE_DISCONNECTED:
     transitionTo(disconnectedState);
     break;
   case CONNECTION_ERROR:
      transitionTo(disconnectedState);
     break;
   case CONNECTION_TIMEOUT:
     transitionTo(disconnectedState);
     break;
   // ... 
}

在我当前的项目中,我有以下枚举:

enum NodeType
{
  SCALAR, COMPOSITE, ARRAY, RESTRICTED_ARRAY
};
因此,相当多的节点处理例程使用这种模式:
switch (nodeType)
{
  case SCALAR:
    processScalar();
    break;
  case COMPOSITE:
    processComposite();
    break;
  case RESTRICTED_ARRAY:
    if (!handleRestrictions())
      return false;
    // continue to next case
  case ARRAY:
    processArray();
    break;
}

请注意,几乎有必要总是标记缺少- break(就像我上面所做的那样)-未来的维护者(包括3个月后的您自己)会感谢您的。

我经常使用这样的结构来解析命令行参数:

switch (argument) {
    case arg_h:
    case arg__help:
    case arg_questionmark:
        printf("Helpn");
        break;
    case arg_f:
    case arg__file:
        //...
}

其中参数为enum类型