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 ++中使用上述功能?
答案 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是枚举类型。