在C / C ++中'switch'有什么有趣的用途?

时间:2014-03-17 09:34:09

标签: c++ c switch-statement

C / C ++中的开关语句具有一个相互作用的功能,即如果满足条件,将执行所有后续块

例如,

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 ,除非我在案例2中添加 break 语句。

在3年(非常小,是的)我的C / C ++编程经验中,我从来没有遇到过我必须使用 switch 但没有输入 break 的问题在每个案例中。但是,鉴于这个功能已经停留了这么长时间,可能会有一些实用性。

问题 switch 语句有哪些巧妙用途,以便在C / C ++中使用上述功能?

4 个答案:

答案 0 :(得分:7)

我见过的最有趣的用例之一可能是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
        }
}

答案 1 :(得分:6)

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

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个月内)将感谢你。

答案 2 :(得分:5)

当您想要对一组值应用类似的操作时,通常会使用此选项。例如,以下内容:

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

答案 3 :(得分:4)

我经常使用构造来解析命令行参数,如下所示:

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

其中argument是枚举类型。