'switch'在 C/C++ 中有哪些有趣的用途?
What are some interesting uses of 'switch' in C/C++?
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类型
相关文章:
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- 通过switch和static_cast访问多态对象的运行时类型
- 如何将 if else 语句重写为 switch 语句
- 将 out/in out 参数与 if/switch 的 init 语句一起使用
- Switch 语句(字符串)一直选择默认值,除非其为零
- 使用 switch,但我想用字符串而不是 int 进行选择
- 在 C++ 的 Switch Case 中创建对象后对对象调用方法
- C++ switch 语句:对案例进行分组,并针对每个案例给出特定的说明
- 任意大小的 constexpr 数组是否可以用作 switch 语句中的案例?
- 在结构中使用 switch 引用结构中的数据C++
- 为什么在 C/C++ 中交织 switch/for/if 语句是有效的?
- 默认标签显然在 switch 语句中不起作用
- C++如何在 switch 语句中放置两个参数
- 如何在 c++ 中从 switch 语句返回不同类型的变量
- c++:在switch中使用std::pair的可能性
- Visual Studio 编译器的 record-gcc-switch 相当于什么?
- switch-case语句如何在Arduino/C++中工作
- 在编译时自动生成用于稀疏数组索引的switch语句
- 代码样式:在 switch/if 语句的分支中重用控件表达式或控制变量
- C++ Switch 语句中的数学运算