精华内容
下载资源
问答
  • switch语句

    万次阅读 多人点赞 2019-02-17 19:36:16
    switch语句从字面上讲,可以称为开关语句,当然理解上不要以为就只有开和关,可以想象它是一个多路开关。它是一种多分支结构。 switch语句的语法形式为: switch(整型表达式) { case 常量表达式1:语句1 case ...

    1. 语句结构

    语法形式

    switch语句从字面上讲,可以称为开关语句,当然理解上不要以为就只有开和关,可以想象它是一个多路开关。它是一种多分支结构。

    switch语句的语法形式为:

    switch(整型表达式)
    {
        case 常量表达式1:语句1
        case 常量表达式2:语句2
        //……
        case 常量表达式n-1:语句n-1
        default:语句n
    }

    解读整型表达式

    switch后面的小括号是一个整型表达式,这与if不同。if条件表现的是相互对立的两种状态,而对于多分支结构的switch,是用多个整数值表现多种选择。if条件的对立性总是相对于0而言,所以只要某种数据类型的表达式能够表示0值,便可以充当if语句的条件,但是switch中的表达式的值需要对应到不同的处理入口,其相当于入口编号,所以限制以用整型数表示是明智的。

    例如,下面的代码错误地用浮点类型作switch的表达式,因而会引起编译错误:

    float f= 4.0;
    switch (f) {            //错误
        //……
    }

    处理入口

    “case常量表达式:”即处理入口(也称其为“标号”),常量表达式相当于入口编号,入口编号是不能重复的,所以每一个case的常量表达式的值必须互不相同。

    例如,下面的代码是某个switch语句的局部,其case处理入口出现相同常量值,导致了编译错误:

    case 'A' :cout<<"this is A\n";
    case 'B' : cout<<"this is 65\n"; //错误,A等于ASCII码的65

    处理入口编号不能重复,但可以颠倒。也就是说,入口编号的顺序不重要。各个case(包括default)的出现次序可任意。例如:

    swtich(a)
    {
        case 3: b=1; break;
        default: b=2; break;    //正确
        case 1: b=3; break;
    }

    default处理入口:如果switch后面的整型表达式不能匹配任何一个预定的处理入口,那么若有default处理入口,就转入该入口,否则就退出switch语句,什么也不做。

    2. switch嵌套

    switch语句可以嵌套,也就是在switch语句中的入口处理语句中又包含了switch语句。case与default标号是与包含它的最小的switch相联系的。例如:
     

    int i,j;
    //……
    switch(i)
    {
        case 1 ://
        case 2 :
        switch(j)
        {    //嵌套switch
        case 1:
        case 2:
        default:
        }
        case 3:
    }

    switch(j)中的标号(入口编号)虽然与外面的switch(i)中的标号相同,但编译器不会混淆。

    需要switch嵌套是基于switch中的入口语句可以是语句集合,而语句集合是可能需要开关语句作进一步编程处理的。

    3. 用好break

    全程顺序性

    在if语句中,if与else属下各自描述的语句是彼此独立的。但是在switch语句中,每个case只是标定处理入口,各个入口的语句并不排他。因此,switch语句中的全部处理入口描述的语句构成了一个顺序执行的动作序列。例如,下列代码描述一个五级计分的程序:

    switch(grade){
        case 'A': cout<<"Excellent\n";
        case 'B': cout<<"Very Good\n";
        case 'C': cout<<"Good\n";
        case 'D': cout<<"Satisfactory\n";
        case 'E': cout<<"Minimally Acceptable\n";
        default : cout<<"Error\n";
    }
    

    当变量grade取'D'值时,将输出:

    Satisfactory

    Minimally Acceptable

    Error

    而不是所想象的单一的Satisfactory字串。

    break的排他性

    为了让switch中处理入口的语句具有入口独立性,从而有更多的描述灵活性,语言中专为switch语句配备了break语句。在switch语句中遇上break便意味着终止switch语句的执行,这就自然地构成了各个入口语句的互斥。改写上述代码,在每个入口处理的最后填上break语句,便得到:

    switch(grade){
        case 'A': cout<<"Excellent\n";break;
        case 'B': cout<<"Very Good\n";break;
        case 'C': cout<<"Good\n";break;
        case 'D': cout<<"Satisfactory\n";break;
        case 'E': cout<<"Minimally Acceptable\n";break;
        default : cout<<"Error\n";
    }
    

    这时候,当变量grade取'D'时,将只输出对应的成绩描述字串:

    Satisfactory

    switch语句中的最后一条语句的下一句便是出口了,面对的是switch语句终止后的下一条语句,所以就没有必要再用break特地退出了。

    放弃使用的效果

    break语句是在switch语句中人为添加的,而不是默认的,这就多了一些编程操作而显得“笨拙”。一些评论家一次而攻击switch语句“太土”。但正由于加不加是可选的,给switch一些编程的灵活性。例如,频繁输入一个整数n以决定输出n个相同字串“Hello.”便可以有一种用switch语句的更好选择:

    //方法1
    for (int n; cin>>n;)//反复输入整数n
    {
        for(int i=1;  i<=n; i=i+1)//循环控制输出n个字串(1≤n≤3)
            cout<<"Hello."
        cout<<"\n";
    }
    
    //方法2
    for(int n; cin>>n;)
    {
        switch(n){
        case 3: cout<<"Hello."//都没有用break
        case 2: cout<<"Hello."
        case 1: cout<<"Hello."    
    }
        cout<<"\n";
    }

    按这两种方法,则输入:

    2 1 3 0 3 

    都能得到结果:

    Hello.Hello.

    Hello.

    Hello.Hello.Hello.

     

    Hello.Hello.Hello.

    方法1在循环语句中嵌套使用了1~n的for循环语句,以决定输出语句执行的次数。不管怎么说,针对每次输入的整数,都要做n次条件判断。

    方法2在循环语句中使用了开关语句,它通过直接转向执行,完成n次字串输出。

    显然在上述代码中,循环控制结构所付出的代价相对多分支转向结构要大,若数据量很大,则会带来明显的性能差别。

    由于n值很小,使用多分支语句时,通过安排处理的入口编号而使前后语句得到共享,语句简化且易懂。

    选择使用的效果

    break在switch语句中,对每个case分支都是可选的,也就是说,有些可以有,有些可以没有。因为有了这样的特性,编程变得更灵活。例如:

    switch(ch){
        case'-': b=-b;//无break
        case'+': a=a+b;break;
        case'*': a=a*b;break;
        case'/': a=a/b;
    }

    首先要明白,在C++中,并不是只有整型数才可以做加减的。代码中a、b实体如果是大对象,做负号操作可能远比减法操作的代价小,减法操作可能比加法操作还要耗费精力,或者根本没有该数据类型的减法操作。因此,做减法不如预先做反向操作,再做加法划算。

    break注解

    break是一个关键字,该关键字独立构成一条语句,其功能是在switch、for、while、do-while语句中,跳出结构而转向执行吓一条语句。或者说break语句强行终止上述语句的执行。对于if语句,其if-else结构中的语句块本身就是排他性的,所以没有必要用break去干预。

    展开全文
  • 文章目录不加break会怎样switch语句的原理switch语句的注意事项 不加break会怎样 观察下面的代码: 第一段代码是最常见的写法,约定俗成的每个条件语句后添加break。如果因为某种原因没有写break语句,没有对此...

    不加break会怎样

    观察下面的代码:
    在这里插入图片描述
    第一段代码是最常见的写法,也是最好的写法,约定俗成的每个条件语句后添加break。如果因为某种原因没有写break语句,没有对此情况进行过探究的话,可能还真不知道第二、三段代码会输出什么。

    结论:如果不加break,程序从匹配成功的case语句开始,一直到遇见break语句或者执行完成所以条件语句块后才会跳出判断,不管后面的case语句是否匹配成功都会执行语句块中的代码,也就是上面的第二、三段代码。

    有时候会故意缺省break语句来达到某种效果(例如几种判断都执行相同的代码块),不过这种情况极少,比如下面这个并没有太大意义的例子,当检测到当前月份是1、2、3、4月时都会输出“现在是第一季度”:

    switch (month){
        case 1:
        case 2:
        case 3:
        case 4:
            System.out.println("现在是第一季度");
            break;
        default:
            break;
    }
    

    switch语句的原理

    根据经验,当switch语句和if…else if…else语句可以实现相同功能(并且分支较多)时会尽量使用switch语句,因为switch语句的效率更高。

    if…else if…else语句的执行方式是顺序执行所有判断语句,直到满足条件时执行语句代码块。

    switch语句会维护一张跳转表,不管case判断语句的值是不是按照顺序的,内存中的地址表都会按照顺序进行排列。

    switch语句会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的索引号与switch变量的值是相等的。从而,switch-case不用像if-else if那样遍历条件分支直到命中条件,而只需访问对应索引号的表项从而到达定位分支的目的。 具体地说,switch-case会生成一份表项数为case量+1的跳表,程序首先判断switch变量是否大于(小于)最大(最小)case 常量,若大于(小于),则跳到default分支处理;否则取得索引号为switch变量大小的跳表项的地址(即跳表的起始地址+表项大小*索引号),程序接着跳到此地址执行,到此完成了分支的跳转。

    case判断的条件会有下面几种情况,对应switch语句中的执行过程是不一样的:
    1、case条件的值是连续的,例如:case 1、case 2、case 3、case 4、case 5
      在switch中,编译器多增加了一个数组用于存储每个case对应的地址,根据switch中传入的整数在数组中查到到对应的地址,直接通过这个地址跳转到对应的位置。编译器在处理switch时会首先校验不满足所有case的情况,当这种情况发生时代码调转到default或者switch语句块之外。然后将传入的整数值减一(数组元素是从0开始计数)。最后根据参数值找到应该跳转的位置。
    在这里插入图片描述
    2、case条件的值不是连续的,例如:case 1、case 2、case 3、case 5
      去除掉上面的case 4条件后,仍会建立一个表,对应下图中的关系。
    在这里插入图片描述
    3、case条件的值不是连续的,例如:case 1、case 2、case 5、case 6、case 256
      如果case条件间的值差异较大,则编译器会采用索引表的方式来进行地址的跳转,对应下图中的关系。
    在这里插入图片描述
    如果想对内存进行深入研究的话可以编写demo对内存进行跟踪,下面这两篇文章描述的也比较详细:https://www.cnblogs.com/mukekeheart/p/10558167.html、https://www.jianshu.com/p/d382f653dd00

    性能优化

    • 因为if…else if…else语句会逐个条件进行判断,直到命中,所以应将机率大的条件置于前面,这样可以减少比较的次数
    • 如果分支较少,比如小于4个,或者case语句判断的值跳跃较大时,没必要使用switch语句
    • 编译器是根据时间和空间的消耗来决定那种方式效率更高,所以在Switch写判断条件的时候最好做到连续紧密,可以最大限度的节省时间和内存

    switch语句的注意事项

    • 当遇到 break 语句时,switch 才会终止,控制流将跳转到 switch 语句后的下一行
    • Java中的switch语句中表达式的值必须是整型、字符型、字符串类型(JDK7添加的新特性)和枚举类型
      引申:case语句后常量表达式的值绝不可以是实数(有限小数、无限小数),例如case 1.1:即为不合法语句
    • C++中的switch语句中表达式的值必须是整型、字符型和枚举类型,不能是字符串类型
    • switch语句与其他控制语句的一个不同点:每个case中的多条语句加不加大括号均可
    • 最好在switch中添加default语句,用来处理异常情况
    展开全文
  • switch条件语句

    千次阅读 2017-05-01 09:39:58
    switch语句中使用switch关键字来描述一个表达式,使用case关键字来描述和表达式结果比较的目标值,当表达式的值和某个目标值匹配时,会执行对应的case下的语句。 switch的基本语法为 switch(表达式){ case 目标...

    在switch语句中使用switch关键字来描述一个表达式,使用case关键字来描述和表达式结果比较的目标值,当表达式的值和某个目标值匹配时,会执行对应的case下的语句。

    switch的基本语法为

    switch(表达式){
           case 目标值1:
                 执行语句1;
                  break;
           case 目标值2:
                 执行语句2;
                  break;
           case 目标值3:
                 执行语句3;
                  break;
           default:
                  执行语句4;
                  break;
    }

    展开全文
  • 为什么Switch语句内部不能定义变量?(有解决方案)1.问题了解2.问题解答**解决方案:**3.总结 1.问题了解 我相信很多小伙伴们和我一样在使用switch case语句中遇到过这种问题,定义了一个变量,之后编译就报错,之后...

    为什么Switch语句内部不能定义变量?(有解决方案)

    1.问题了解

    我相信很多小伙伴们和我一样在使用switch case语句中遇到过这种问题,定义了一个变量,之后编译就报错,之后也很迷惑不解,这次我们就来认识并解决这个问题。

    下面是我写的一段代码switch case:

    int main() {
    	bool b;
    	switch(b)
    	{
    		case true:
    			std::string file_name;
    			int ival = 0;
    			int jval;
    			break;
    		case false:
    			jval = 5;
    
    			break;
    	}
    }
    
    

    报错信息为:

     Cannot jump from switch statement to this case label
     jump bypasses variable initialization 
     jump bypasses variable initialization
    

    由报错信息得知:不能跳转到某一个特定的case,且出现了两句 略过两个变量的初始化。
    接下来我们来分析一下这个问题:



    2.问题解答

    我们假设该代码合法,即一旦控制流直接跳转到false分支,也就同时略过了变量file_name和ival的初始化过程,此时这两个变量位于作用域之内,跟在false之后的代码试图在尚未初始化的情况下使用它们,这显然是行不通的。

    代码描述:

    
    int main() {
    	bool b;
    	switch(b)
    	{
    		case true:
    			//因为程序的执行流程可能绕开下面的初始化语句,所以该switch语句不合法。
    			string file_name;     //错误,控制流绕过一个隐式初始化的变量
    			int ival = 0;         //错误:控制流绕过一个显示初始化的变量
    			int jval;             //正确:因为jval没有初始化
    			break;
    		case false:
    			//正确,kval虽然在作用域内,但是它没有被初始化。
    			jval = 5;             //正确:给jval赋一个值
    
    			break;
    	}
    }
    

    因此答案是:如果在某处一个带有初始值的变量(可以显式初始化,可以隐式初始化)位于作用域之外,在另一处该变量位于作用域之内,则从前一处跳转到后一处的行为是非法行为。

    C++语言规定:不允许跨过变量的初始化语句直接跳转到该变量作用域的另一个位置。



    解决方案

    如果需要为某个case分支定义并初始化一个变量,我们应该把变量定义在块内,从而确保后面的所有case标签都在变量的作用域之外。

    int main() {
    	bool b;
    	switch(b)
    	{
    		case true:
    		{
    			//正确:声明定义语句均在语句块内部
    			string file_name("sss");
    			int ival = 0;
    			int jval;
    		}
    		    break;
    		case false:
    		{
    			
    		}
    		    break;
    	}
    }
    
    






    3.总结

    C++语言规定:不允许跨过变量的初始化语句直接跳转到该变量作用域的另一个位置, 如果需要为某个case分支定义并初始化一个变量,我们应该把变量定义在块内,从而确保后面的所有case标签都在变量的作用域之外,这样就不会报错了。



















    ----------------------------------------------已经到底了,点个赞吧,lovely program monkeys--------------------------------
    展开全文
  • switch分支语句合并相同功能的case语句

    万次阅读 多人点赞 2018-10-23 21:01:29
    switch 语句用于:根据一个变量的不同取值,来执行不同的代码。 语法: switch(n) { case 1: 执行代码块 1 break; case 2: 执行代码块 2 break; default: 如果以上条件都不满足,则执行该...
  • switch语句与多重if选择结构的异同点

    千次阅读 2019-02-16 23:41:15
    switch语句与多重if选择结构的异同点 相同点:都是用来处理多分支条件的结构。 不同点:switch语句只能处理等值条件判断的情况,而且条件只能是整型变量或字符型变量。 (也能是String)。多重if选择结构的限制,特别...
  • 关于if和switch两种条件语句的思考

    千次阅读 2017-04-09 01:08:13
    switch…case语句和if…else效率比较switch…case结构中有跳转表,输入的字符只要经过一次比较就可以正确的找到跳转分支,所以平均情况下跳转次数为1.if…else结构如果有n个分支,分别记为n0,n1,n2,n3,…n(i-1),每个...
  • --------------三目运算符、if语句、switch语句、while循环、for循环-------------------------------- 三目运算符: 语法格式:boolean类型表达式 ? 表达式1 : 表达式2; 三目运算符的利弊: 利:简化了if else...
  • 项目26.4个人所得税计算器switch语句

    千次阅读 2015-10-02 23:44:15
    任务和代码:写选择结构程序...问题描述: 编写选择结构程序,输入个人月收入总额,计算出他本月应缴税款和税后收入 程序输出:本月应缴税款和税后收入 */ #include int main ( ) { double dSalary,dTax=0,dNetIncom
  • switch case 语句

    2008-03-31 10:05:00
    下面的程序将打印一个单词,...请描述该程序的行为:import java.util.Random;public class Rhymes {private static Random rnd = new Random();public static void main(String[] args) {StringBuffer word = null;swi
  • 【C++入门系列】C++ Primer Plus 第六章分支语句和逻辑操作符的笔记 用例子阐释了 逻辑表达式,问号操作符,switch语句,break和continue以及文件简单输入输出
  • goto语句正确运用

    万次阅读 多人点赞 2018-05-30 09:52:00
    最近学习obs源码,插件库里是有许多goto语句,由于对goto语句不太了解,踩了很多坑。记录一下:1 含义,goto语句也称为无条件转移语句;goto语句的语义是改变程序流向, 转去执行语句标号所标识的语句;goto语句通常...
  • 4.1 选择结构 switch(流程控制语句)

    千次阅读 2018-03-14 19:14:05
    4.1 选择结构 switch switch 条件语句也是一种很常用的选择语句,它和if条件语句不同,它只能针对某个表达式的值作出判断,从而决定程序执行哪一段代码。实例伪代码: 如果等于1,则输出星期一 如果等于2,则输出...
  • switch 条件语句也是一种很常用的选择语句,它和if条件语句不同,它只能针对某个表达式的值作出判断,从而决定程序执行哪一段代码。例如,在程序中使用数字1~7来表示星期一到星期天,如果想根据某个输入的数字来输出...
  • Java程序设计基础(第5版) 陈国君 清华大学出版社 习题4.1 将学生的学习成绩按不同的...要求用switch语句实现。 代码块: package ; import java.util.*; public class Test1 { public static void main(String[]...
  • switch 条件语句也是一种很常用的选择语句,它和if条件语句不同,它只能针对某个表达式的值作出判断,从而决定程序执行哪一段代码。 例如,在程序中使用数字1~7来表示星期一到星期天,如果想根据某个输入的数字来...
  • 前言 多写代码,才能发现问题,即使现成的代码,手打一遍也有收获,这不遇到一个很无语的问题。 问题及原因、解决方法见以下转载内容。... 平常写代码过程中常会遇到在switch-case中定义局部变量(如下面...
  • break语句和continue语句的区别

    千次阅读 2018-12-28 19:28:29
    注意: break语句只能用于循环语句和switch语句之中,而不能单独使用。 2、continue 作用是结束本次循环,即跳过循环体中下面尚未执行的语句,转到循环体结束点之前。 3、break语句和continue语句的区别 continue...
  • android 不能试用switch

    千次阅读 2015-08-03 15:19:25
      当我们在Android依赖库中使用switch-case语句访问资源ID时会报如下图所示的错误。   分析原因: 报的错误是case分支后面跟的参数必须是常数,换句话说出现这个问题的原因是Android library中生成的R...
  • JS条件语句

    2021-01-07 17:44:14
    任务描述 本关任务:根据成绩判断考试结果。 相关知识 在编程中,我们常常根据变量是否满足某个条件来执行不同的语句。 JavaScript中利用以if关键字开头的条件语句达到以上目的,根据if后面括号内表达式的计算结果来...
  • 描述  switch开始一个允许通过多路分支来控制程序流的分段。 参数ControlExpression结果必须为一个整数值。 这个值决定了跳转到哪个标记。 每个case语句都包含一个整型常量。 如果case语句的整数常量等于参数...
  • python: 条件语句、断言

    千次阅读 2018-01-21 21:58:20
    语句块 1、语句块并非一种语句语句块是一组满足一定条件时执行一次或多次的语句语句块的创建方式是在代码前放置空格缩进 2、同一段语句块中的每行语句都要保持同样的缩进,如果缩进不同,python编译器就会认为...
  • Linux进程上下文切换过程context_switch详解 日期 内核版本 架构 作者 GitHub CSDN 2016-06-14 Linux-4.6 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度 前面我们了解了linux进程调度器的...
  • switch语句支持使用枚举类型作为条件 case标签支持: 1.类型为char、byte、short、int的常量表达式 2.枚举常量 3.从jdk7开始,支持字符串 这是我出错的代码: 枚举定义: 代码错误提示: 发现case后报错...
  • sql语句纵向转横向

    万次阅读 2017-11-21 10:12:55
    mysql中的case when语句查询结果问题 数据库中的测试数据 ...为什么加上MAX就能显示正确的结果 ,case xx when 条件 then 结果 为什么第一条语文是正确的结果 其他的两个都不能正确显示呢?资料说...
  • java中语句的分类

    千次阅读 2016-06-28 21:28:10
    在Java中,一个语句是指一个过程的完整描述,就如流程图的一个环节。 总的来说,java中语句的分类有六类:①方法调用语句②表达式语句③复合语句④空语句⑤控制语句⑥package语句和import语句。 ①方法调用语句:...
  • 分支结构 分类: if语句 1、if最简单的用法 格式: if (表达式) 语句 功能: 如果表达式为真,语句执行...解释:if默认只能控制语句A的执行或不执行,if无法控制语句B的执行或不执行,或者讲,语句B一定会执行 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 40,242
精华内容 16,096
关键字:

关于switch语句的正确描述是