简谈switch case
工作中从buff里截取了一个字符串,然后和配置文件中的字符串名字对比 ,如果一样,处理,不一样,elseif 再判断,再处理!
switch(){
case :
case :
......
}
先说语法,再说注意事项
switch的判断变量类型只能是字符型或者整型,
请注意,只有这两种才可以switch后面紧跟的那个小括号里面 就是 要判断的变量名称
然后switch要求它后面的大括号完整,
不能不写case 后面加一个空格跟上条件
当然条件也只能是字符型或者整型,然后加上冒号,条件语句正式开始 ,
末了,不要忘记分号,然后每个case语句结束时不要忘记加上一个break;
至于原因稍后解释
在所有的判别情况都表述完之后 再加一个default:语句,
用法与case一样,但是注意的是default后面直接加:了,不需要再加判别条件,
default一定是加在所有的case语句最后的
switch选择结构执行的时候,从上往下寻找匹配,当寻找到第一个匹配条件后结束寻找,程序跳到该条件所对应的代码处执行,当执行完之后并不终止,而是继续执行下去,所以,在第一个匹配条件后的所有语句都会被执行,这也就是我们为什么要加一个break;的原因了,我们用break跳出当前switch语句来避免我们不希望的语句也被执行。default语句放在最后的原因也在这里了,default语句代表的意义是,无论如何(也就是说defautl是一个万能匹配)都会被执行的语句,如果是把它放到了非最后的位置了,那么它之下的所有语句都失去意义了,上面说过了,当得到第一个匹配之后就顺序执行了,default又是一个万能匹配,所有非case数据都会走 default下的执行语句,default不是必须的,但是我强烈建议每次都要写上,它处理所有你没有涉及到的情况之外的情况,可以避免漏掉某种可能……
常用的格式类型:
switch (控制表达式) {
case 常量表达式1: 语句列表1
case 常量表达式2: 语句列表2
...
default: 语句列表n
}
下边为网上搜的一个运行例子:
C/C++中
switch
-
case
用法归纳
if
语句处理两个分支,处理多个分支时需使用
if
-
else
-
if
结构,但如果分支较多,则嵌套的
if
语句层就越多,程序不但庞大而且理解也比较困难.深层嵌套的
else
-
if
语句往往在语法上是正确的,但逻辑上却没有正确地反映程序员的意图。例如,错误的
else
-
if
匹配很容易被忽略。添加新的条件和逻辑关系,或者对语句做其他的修改,都很难保证正确性。因此,C/C++语言又提供了一个专门用于处理多分支结构的条件选择语句,称为
switch
语句,又称开关语句.它可以很方便地来实现深层嵌套的
if
/
else
逻辑。
使用
switch
语句直接处理多个分支(当然包括两个分支).其一般形式为:
switch
(表达式)
{
case
常量表达式1:
语句1;
break
;
case
常量表达式2:
语句2;
break
;
……
case
常量表达式n:
语句n;
break
;
default
:
语句n+1;
break
;
}
switch
语句的执行流程是:首先计算
switch
后面圆括号中表达式的值,然后用此值依次与各个
case
的常量表达式比较,若圆括号中表达式的值与某个
case
后面的常量表达式的值相等,就执行此
case
后面的语句,执行后遇
break
语句就退出
switch
语句;若圆括号中表达式的值与所有
case
后面的常量表达式都不等,则执行
default
后面的语句n+1,然后退出
switch
语句,程序流程转向开关语句的下一个语句.
以上是
switch
-
case
的正规写法,
default
语句总是写在最后。但是,如果把
default
语句间在了
case
的中间,执行的结果又是怎样的呢?笔者测试了一下几种有代表性的情况,把结果简单罗列如下:
A. 每个语句中
break
齐整
switch
(c)
{
case
'1'
:
printf
(
"1\n"
);
break
;
default
:
printf
(
"default\n"
);
break
;
case
'2'
:
printf
(
"2\n"
);
break
;
case
'3'
:
printf
(
"3\n"
);
break
;
}
此种情况最为规整,
default
写在中间跟写在最后的效果一致。
B.
default
语句后没有
break
switch
(c)
{
case
'1'
:
printf
(
"1\n"
);
break
;
default
:
printf
(
"default\n"
);
// break;
case
'2'
:
printf
(
"2\n"
);
break
;
case
'3'
:
printf
(
"3\n"
);
break
;
}
此种情况下,输入分别为 1、 2、 3、 4,对应的输出分别为 1、 2 、3、
default
2(换行省略了,实际运行时有换行的);即此种情况下遵循A中的执行顺序和一般的标号规则。
C. 最后一个
case
没有
break
switch
(c)
{
case
'1'
:
printf
(
"1\n"
);
break
;
default
:
printf
(
"default\n"
);
break
;
case
'2'
:
printf
(
"2\n"
);
break
;
case
'3'
:
printf
(
"3\n"
);
// break;
}
此种情况下,输入分别为 1、 2、 3、 4,对应的输出分别为1、2、3、
default
.可见实际的运行效果并不等同于把
default
语句挪到最后的运行效果。否则,输入为3时,输出应该为 3
default
.
D.
default
和最后一个
case
都没有
break
switch
(c)
{
case
'1'
:
printf
(
"1\n"
);
break
;
default
:
printf
(
"default\n"
);
// break;
case
'2'
:
printf
(
"2\n"
);
break
;
case
'3'
:
printf
(
"3\n"
);
// break;
}
由上面A,B,C三种情况的运行结果,我们可以推测出D这种情况的运行结果。当输入分别为 1、2、3、4时,输出为1、2、3、
default
2. 结果与B的情况相同。
kafka中的一个switch case的使用例子:
void msg_consume(RdKafka::Message* message, void* opaque) { switch (message->err()) { case RdKafka::ERR__TIMED_OUT: break; case RdKafka::ERR_NO_ERROR: /* Real message */ std::cout << "Read msg at offset " << message->offset() << std::endl; if (message->key()) { std::cout << "Key: " << *message->key() << std::endl; } printf("%.*s\n", static_cast<int>(message->len()), static_cast<const char *>(message->payload())); break; case RdKafka::ERR__PARTITION_EOF: /* Last message */ if (exit_eof) { run = false; } break; case RdKafka::ERR__UNKNOWN_TOPIC: case RdKafka::ERR__UNKNOWN_PARTITION: std::cerr << "Consume failed: " << message->errstr() << std::endl; run = false; break; default: /* Errors */ std::cerr << "Consume failed: " << message->errstr() << std::endl; run = false; } }
---------------------------------->人生犹如负重致远,不可急于求成。
自律使人自由!