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语句?
也许最有趣的使用情况我已经看到了将一个达夫设备,你一个内延伸范围的情况下开关在多个案件这将是这个样子:
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)
在我当前的项目中,我有以下枚举:
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个月内)会感谢你.
当您想要对一组值应用类似的操作时,通常会使用此选项.例如,以下内容:
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)
我经常使用一个构造来解析这样的命令行参数:
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)
其中参数是枚举类型。
归档时间: |
|
查看次数: |
808 次 |
最近记录: |