简谈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;
}
}
简谈switch case的更多相关文章
- MPI简谈
MPI简谈 MPI是分布式内存系统,区别于OpenMP和Pthreads的共享内存系统.MPI是一种基于消息传递的并行编程技术,是如今最为广泛的并行程序开发方法. MPI前世今生 MPI(Messag ...
- Android Studio快捷键switch case 轻松转换为if else
Android Studio快捷键switch case 轻松转换为if else 今天碰到的问题,没有找到资料,后面找到了方法,这个记下来,转载请注明出处:http://www.cnblogs.co ...
- java中的switch case
switch-case语句格式如下 switch(变量){ case 变量值1: //; break; case 变量值2: //...; break; ... case default: //... ...
- 为什么说在使用多条件判断时switch case语句比if语句效率高?
在学习JavaScript中的if控制语句和switch控制语句的时候,提到了使用多条件判断时switch case语句比if语句效率高,但是身为小白的我并没有在代码中看出有什么不同.去度娘找了半个小 ...
- .NET简谈接口
自从面向对象开发方式的出现,抽象的概念就开始日新月异的发展,面向对象编程.面向接口编程.面向组件编程等等:这一系列的概念都是软件工程所追求的思想范畴,高类聚低耦合. 今天我要简谈的是面向对象里面非常重 ...
- c语言基础表达式, 关系运算符, 逻辑运算符, 位运算符, 数据的取值范围, 分支结构(if...else, switch...case)
1.表达式: 表达式的判断是有无结果(值), 最简单的表达式是一个常量或变量, 如:12, a, 3 + 1, a + b, a + 5 都是表达式 2.BOOL(布尔)数据类型: c语言中除了基本数 ...
- 运算符 与 分支语句:if ,else if,else;switch case
分支语句: if else if else : switch case --如何使用 if else if else: Console. ...
- switch...case和if...else if的判断应用
判断成绩所属等级的 两种方法 1... switch...case方法: #include<stdio.h> int main(void) { ;i <= ;++i) // ...
- go语言选择语句 switch case
根据传入条件的不同,选择语句会执行不同的语句.下面的例子根据传入的整型变量i的不同而打印不同的内容: switch i { case 0: fmt.Printf("0") case ...
随机推荐
- 根据位置信息提取 fasta 文件中的序列 -- extract fasta sequence by their position
#!/usr/bin/env python # usages: python extract_seq_by_pos.py input.fasta id_start_end > result.fa ...
- 【unity shaders】:Unity中的Shader及其基本框架
shader和Material的基本关系 Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出.绘图单元可以依据这个输出来将图 ...
- epoch和Iteration
做机器学习时遇到epoch和iteration,一开始有点迷惑.不是一个意思吗? epoch可以翻译成"回合".一个epoch内,做一次train+一次test iteration ...
- 大规模图的存储(前向星、next数组)
大规模图的储存 在信息学中,经常会遇到比较大规模图,使用指针固然是很好的方法,不过一有指针速度不如数组之说,二有指针不如数组稳定之说,三有,也是最重要的,指针不如数组来得方便,这也便是大多数Oier不 ...
- Matlab以特殊分隔符写入txt(dlmwrite)
clc clear all load('E:\RSWeb\mahoyt数据集\movielens\u.data'); dlmwrite('E:\RSWeb\mahoyt数据集\movielens\ne ...
- Linux Overflow Vulnerability General Hardened Defense Technology、Grsecurity/PaX
Catalog . Linux attack vector . Grsecurity/PaX . Hardened toolchain . Default addition of the Stack ...
- 过滤器(Filter)的应用
过滤器的概念 Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应. 主要用于对HttpServletRequest 进行预处理,也可以对HttpSe ...
- hdu 2010 - 水仙花数
题意: 数学上有个水仙花数,他是这样定义的:"水仙花数"是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3.现在要求输出所有在m和n范围内的水仙花 ...
- 【Beta】第三次任务发布
后端(补做) #86 了解社区新建文章.添加评论(回复)的机制.整理成API文档,包括如何请求新建文章.新建评论(回复).如何获取文章内容和评论内容. 验收条件:文档PM要能看懂. 前端(补做) #8 ...
- linux(centos) 项目部署阶段相关命令汇总
1.ssh免密码登陆主要命令cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys-->添加公钥service sshd restart -- ...