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

Che*_*eku 5 c c++ switch-statement

C/C++中的switch语句具有一个interesing功能,如果满足条件,将执行所有后续块

例如,

int a = 2;
int b = a;
switch(b)
{
     case 1:cout<<1;
     case 2:cout<<2;
     case 3:cout<<3;
     case 4:cout<<4;
};
Run Code Online (Sandbox Code Playgroud)

除非我在案例2中放置了break语句,否则上面的代码将输出234.

在3年(非常小,是的)我的C/C++编程经验中,我从来没有遇到过一个问题,我不得不使用switch而不是在每种情况下都使用break语句.但是,鉴于此功能已经停留了这么长时间,可能会有一些实用性.

问:对于在C/C++中使用上述功能,有什么巧妙的使用switch语句?

Sha*_*our 7

也许最有趣的使用情况我已经看到了将一个达夫设备,你一个内延伸范围的情况下开关在多个案件这将是这个样子:

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
        }
}
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,使用`goto`(这就是`switch`归结为)来跳转到循环可能会使优化器偏离轨道.这可能比Duff设备的收益更不利于性能.因此,虽然Duff的Device在发明时曾经是一个很好的优化,但我不会在新代码中使用它. (3认同)

Rei*_*ica 6

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

enum NodeType
{
  SCALAR, COMPOSITE, ARRAY, RESTRICTED_ARRAY
};
Run Code Online (Sandbox Code Playgroud)

因此,相当多的节点处理例程使用这种模式:

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;
}
Run Code Online (Sandbox Code Playgroud)

请注意,几乎有必要始终break用评论标记缺乏明确的意图(就像我上面所做的那样) - 未来的维护者(包括你自己在3个月内)会感谢你.


Hal*_*oum 5

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

switch (event) {
   case DEVICE_DISCONNECTED:
   case CONNECTION_ERROR:
   case CONNECTION_TIMEOUT:
     transitionTo(disconnectedState);
     break;
   case CONNECTION_SUCCESS:
     transitionTo(connectedState);
     break;
}
Run Code Online (Sandbox Code Playgroud)

在我看来,它比以下更加简洁和可读:

switch (event) {
   case DEVICE_DISCONNECTED:
     transitionTo(disconnectedState);
     break;
   case CONNECTION_ERROR:
      transitionTo(disconnectedState);
     break;
   case CONNECTION_TIMEOUT:
     transitionTo(disconnectedState);
     break;
   // ... 
}
Run Code Online (Sandbox Code Playgroud)


urz*_*eit 5

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

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

其中参数是枚举类型。

  • 我从来没有想过这个,很酷的主意! (2认同)