前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >多个if-else语句执行顺序、if-else与if-else if-else不同执行顺序、switch执行顺序

多个if-else语句执行顺序、if-else与if-else if-else不同执行顺序、switch执行顺序

作者头像
用户7886150
修改于 2021-02-01 02:38:07
修改于 2021-02-01 02:38:07
4.2K0
举报
文章被收录于专栏:bit哲学院bit哲学院

参考链接: java if-else

在Java中多个 if-else 之间的执行顺序有什么区别呢? 

对于 if-else 语句,它是 单条件双分支语句,即程序的执行流程是根据 一个条件来控制的; 

如下代码演示了存在多个 if - else 时的执行顺序: 

                int test11 = 2;

        if (test11 > 1) {    // if语句判断

            int test21 = 10;

            test11 = test21;

            System.out.println(test11); // if表达式的值为true,则输出test1为10

        }else{

            int test31 = 100;

            test11 = test31;

            System.out.println(test11); // if表达式的值为false,则输出test1为100

        }

        if (test11 < 1) {    // if语句判断

            int test21 = 10;

            test11 = test21;

            System.out.println(test11); // if表达式的值为true,则输出test1为10

        }else{

            int test31 = 100;

            test11 = test31;

            System.out.println(test11); // if表达式的值为false,则输出test1为100

        } 

一、在代码中,存在两个 if-else 语句 ,程序执行时他们相互之间是独立的,互不干扰的; 

二、这两个 if - else 执行顺序为: 

1、先执行第一个 if - else 语句中的 if ( test11 > 1 ) ,当表达式 test11 > 1 为 true 时,则执行其 { } 里面的若干语句,在这里是执行三条语句;当执行完 { } 中的三条语句后,就结束第一个 if - else 语句了 , else {} 部分是不会再执行了,即: 

else{             int test31 = 100;             test11 = test31;             System.out.println(test11); // if表达式的值为false,则输出test1为100         } 

 是不再执行的;反之,当表达式 test11 > 1 为 false 时 ,则不会执行其 { } 里面的三条语句 ,而是执行 else 后面的 { } 中三条语句 ,执行完三条语句后,就结束第一个 if - else 语句了 ; 

2、当第一个 if - else 结束后,执行顺序就到 第二个 if - else 语句,和第一个 if - else 一样,先判断语句 if (test11 < 1) 中表达式的值,当表达式 test11 < 1 为 true 时,则执行其 { } 里面的若干语句,并结束第二个 if - else 语句 ,否则执行 else 后面的 { } 中的语句,并结束第二个 if - else 语句; 

3、以上代码演示最终输出为:10  100 ; 

4、if - else 总结:对于 if - else 语句 就是 ,先判断表达式的值,为true则执行其 { } 中若干语句,并结束语句,为false则执行其 else 后面的 { }中的语句,并结束语句; 

再次强调: 

对于 多个 if - else 语句,程序执行时是从第一个 if - else 开始判断的,只有当执行完第一个 if - else ,程序才会继续往下执行第二个,第三个,第四个 if - else 语句,而且每个 if - else 语句之间是独立的,互不干扰的,你执行你的 if - else ,我执行我的 if - else ; 

在Java中 if-else 与 if-else if-else之间不同执行顺序: 

一、首先要了解 if - else 与 if - else if - else 之间的本质是不一样的: 

1、if - else 是 单条件双分支 语句; if - else if - else  是 多条件分支 语句 ; 

if - else 单条件双分支 语句是: 

一个条件控制两个分支语句执行顺序,当条件为 true 则执行其对应的一个分支语句,而另外一个分支就不再执行了,当条件为 false 则执行其对应的一个分支语句,而另外一个分支也不会再执行了; 

if - else if - else 多条件分支 语句是: 

语句中有多个条件,每一个条件控制自己一个分支语句,语句执行时,先从第一个 if ( ) 中的表达式开始判断,当表达式中值为 true 则执行该 { } 中若干语句,并结束当前整个 if - else if - else ,也就是后面的 else if - else 都不会再继续判断和执行了;当第一个 if ( ) 中的表达式的值为false时,则往下对 else if 进行判断,一直到多个条件中有表达式的值为true,才结束语句;若多个条件都为false时,则执行最后 else 后面 { } 中的若干语句,并结束当前整个 if - else if - else ;如下代码进行演示:代码中每个 if () 中表达式的值都是 false ,所以最后只执行 else {} 中的若干语句,并结束当前语句,程序输出为 100000 ;

                int test1 = 10 ;

        if(test1<1){

            test1 = 100;

            System.out.println(test1);  // 当表达式 test<1 为true,则输出 test1 的值为100

        }else if(test1<2){

            test1 = 1000;

            System.out.println(test1);  // 当表达式 test<2 为true,则输出 test1 的值为 1000

        }else{

            test1 = 100000;

            System.out.println(test1);  

// 当以上表达式都为false时,则输出 test1 的值为 100000,并结束该if-else if-else语句

        } 

那么 if-else 与 if-else if-else之间不同执行顺序是: 

对于 if - else 语句,系统程序只会进行一次表达式的判断,当表达式的值为 true 则执行其 { } 中的若干语句,并结束当前整个语句,后面的 else 不再执行了;若表达式的值为 false 则执行其 else { } 中的若干语句,并结束当前整个语句;对于 if - else if - else 语句,系统程序会进行多次表达式的判断,直到其中有一个表达式的值为 true ,才会执行其对应的若干语句,并结束当前整个语句;若全部表达式的值都为 false 时,则执行其最后 else { } 中的若干语句,并结束当前整个语句;

需要注意的是:有多个 else if 语句的情况下,如 if - else if - else if - else if - else : 

要是 if 中表达式为  false ,下面三个 else if 的表达式的值都是 true 那要怎么执行呢? 

其实很简单,当 三个 else if 的表达式的值都是 true 时,系统程序只会执行第一个 else if 中表达式的值为true的若干语句,并结束当前整个语句,而后面两个 else if 是不会被执行的; 如下代码进行演示: 

                int test1 = 10 ;

        if(test1<1){

            test1 = 100;

            System.out.println(test1);  // 当表达式 test<1 为true,则输出 test1 的值为100

        }else if(test1>2){

            test1 = 1000;

            System.out.println(test1);  // 当表达式 test<2 为true,则输出 test1 的值为 1000

        }else if(test1>3){

            test1 = 10000;

            System.out.println(test1);  // 当表达式 test<3 为true,则输出 test1 的值为 10000

        }else if(test1>4){

            test1 = 100000;

            System.out.println(test1);  // 当表达式 test<3 为true,则输出 test1 的值为 100000

        }else{

            test1 = 0;

            System.out.println(0);  // 当以上表达式都为false时,则输出 test1 的值为 0,并结束当前整个语句

        } 

在代码中,test1 > 2 , test1 > 3 , test1 > 4 都是为true的,但是程序只会执行第一个表达式 test1 > 2 的若干语句,并结束整个语句了,后面的 test1 > 3 , test1 > 4 都不会在判断和执行了; 

以下单独对 if 语句、if else语句、if - else if - else 语句、switch开关语句进行逐一分析: 

一、if语句是单条件单分支语句,根据一个条件来控制程序执行的流程; 

1、if语句的语法格式: 

if(表达式){

  若干语句

2、if语句中表达式的值必须是boolean类型的,当值为 true 时,则执行 {} 中的 若干语句 ;当值为 false 时则结束当前 if 语句; 

以下代码进行演示: 表达式 test>1 为真,所以执行 {} 中的三条语句,最后结果输出 100 ; 

                int test = 10 ;

        if(test>1){                  //if语句判断

            int tests = 100 ; 

            test = tests ;

            System.out.println(test);    //输出test为100

        } 

3、if语句中,当 {} 中的语句只有一条时,可以省略 {} , 但是为了增强代码的可读性,建议大家不要省略;如下演示: 

        int test = 10 , tests = 100 ;                

        if(test>1){

       System.out.println(test);  // test>1为真,输出test

    }

        if(tests<1)

           tests = test ;

    System.out.println(tests); // tests<1为假,则不进行tests = test ;语句,输出tests为100 

二、if-else语句是单条件双分支语句,与if语句一样根据一个条件来控制程序执行的流程; 

1、if-else语句的语法格式: 

if(表达式){

  若干语句

}else{

  若干语句

2、if-else语句中表达式的值必须是boolean类型的,当值为 true 时,则执行紧跟 () 后面的 {} 中的若干语句 ;当值为 false 时则执行紧跟 关键字else 后面的 {} 中的若干语句 ; 

以下代码进行演示: 表达式 test > 1 为真,所以执行紧跟 () 后面的 {} 中的语句,最后结果输出 10 ; 

                int test1 = 2;

        if (test1 > 1) {    // if语句判断

            int test2 = 10;

            test1 = test2;

            System.out.println(test1); // if表达式的值为true,则输出test1为10

        }else{

            int test3 = 100;

            test1 = test3;

            System.out.println(test1); // if表达式的值为false,则输出test1为100

        }  

3、if-else语句中,当 {} 中的语句只有一条时,可以省略 {} , 但是为了增强代码的可读性,建议大家不要省略;如下演示: 

        int test1 = 2;

    if (test1 > 1)     // if语句判断

        test1 = 10;    // if表达式的值为true,则输出test1为10

    else

        test1 = 100;   // if表达式的值为false,则输出test1为100

    System.out.println(test1); // 此输出语句,不属于上面的 if-else 语句当中 ; 用于输出test1的值 

特别注意:以下代码是错误的,报错:Syntax error on token "else", delete this token 

        int test1 = 2;

    if (test1 > 1)     // if语句判断

        test1 = 10;

        System.out.println(test1); // if表达式的值为true,则输出test1为10

    else

        test1 = 100;

        System.out.println(test1); // 此输出语句,不属于上面的 if-else 语句当中 ; 用于输出test1的值 

因为:该 if-else 语句中,紧跟 () 后面的语句已经不止一条了,所以程序报错,对于else后面的 方法调用语句 System.out.println(test1) ;  是不属于该 if-else 语句中的,程序通过; 

解决:去掉 test1 = 10 ; 或者 方法调用语句 System.out.println(test1) ;  即可 

三、if - else if - else 语句是多条件分支语句,即多个条件来控制程序执行的流程; 

1、if - else if - else 语句的语法格式: 

if(表达式){

  若干语句

}else if(表达式){

  若干语句

}else if(表达式){

  若干语句

}

.

.

.

else{

  若干语句

}

2、if - else if - else 语句中每个 if 后面中表达式的值必须是boolean类型的,当值为 true 时,则执行紧跟该if的 () 后面的 {} 中的若干语句 ;当值为 false 时则继续判断下一个 else if 的 () 中表达式的值,以此类推,直到结束该  if - else if - else 语句 ; 

以下代码进行演示: 当每个if后面的表达式都为 false 时,则执行最后 else 中的若干语句,最后输出test1为 100000 ; 

                int test1 = 10 ;

        if(test1<1){

            test1 = 100;

            System.out.println(test1);  // 当表达式 test<1 为true,则输出 test1 的值为 100

        }else if(test1<2){

            test1 = 1000;

            System.out.println(test1);  // 当表达式 test<2 为true,则输出 test1 的值为 1000

        }else if(test1<3){

            test1 = 10000;

            System.out.println(test1);  // 当表达式 test<3 为true,则输出 test1 的值为 10000

        }else{

            test1 = 100000;

            System.out.println(test1);  

// 当以上表达式都为false时,则输出 test1 的值为 100000,并结束该if-else if-else语句

        } 

3、if - else if - else 语句中,当每个 if 后面 {} 中的语句只有一条时,可以省略 {} , 但是为了增强代码的可读性,建议大家不要省略;和以上 if 语句、if - else 语句 是一样的; 

4、需要注意的是,对于 if - else if - else 语句中没有最后的 else 且 每个if 后面的表达式都为 false 时,则结束当前的 if - else if - else 语句; 

四、switch 开关语句是单条件多分支语句; 

1、switch 语句的语法格式:其中 break 是可选的,用于结束当前 switch 开关语句; 

switch(表达式){

  case 常量值1: 若干语句 break;

  case 常量值2: 若干语句 break;

  case 常量值3: 若干语句 break;

  ...

  case 常量值n: 若干语句 break;

  default:

         若干语句

2、switch 语句的执行流程: 

switch首先判断表达式的值,要是表达式中的值 与 case 后面的常量值相等,就执行该 case 里的若干语句直到遇见break语句为止;若执行该 case 里的若干语句没有break语句时,则程序不止执行该 case 里的若干语句,还会继续执行后继的 case 里的若干语句,直到遇见 break 语句 ;若 switch 语句中 表达式的值 与 属于 case 后面的常量值都不相等,则执行 default 后面的若干语句 ;其中 default 是可以不要的;若 switch 语句中 表达式的值 与 属于 case 后面的常量值都不相等,并且没有 default 时,该 switch 语句不执行任何操作;如下演示:因为 case 1: 后面没有 break 语句,所以会继续执行后继的 case 里的若干语句,直到遇见break语句,结果输出为 1 2 11 ;

                int test = 1 ;

        switch(test){

         case 1: test = 1 ;System.out.println(test); 

         case 2: test = 2 ;System.out.println(test); 

         case 11: test = 11 ;System.out.println(test); break;

                 case 12: test = 12 ;System.out.println(test); 

         default: test = 0 ;

        } 

3、switch 语句中 () 里 “ 表达式 ” 的值可以是byte、short、int、char类型的值;如下演示: 

                int test = 11 ;

        double testd = 100 ;

        switch(test){

         case 1: test = 1 ;System.out.println(test); break; 

         case 2: test = 2 ;System.out.println(test); break; 

         case 11: test = 11 ;System.out.println(test); break; 

         default: test = 0 ;

        } 

需要注意的是,switch 中 () 里 “ 表达式 ” 的值不可以是 long、float、double 类型的值,否则报错: 

Cannot switch on a value of type double. Only convertible int values, strings or enum variables are permitted 

4、switch 语句中 case 常量值: 中常量值也可以是byte、short、int、char类型的值,而且是互不相同的;如下演示: 

                int test = 1 ;

        switch(test){

         case 1: test = 1 ;System.out.println(test); 

         case 2: test = 2 ;System.out.println(test); 

         case 'a': test = 11 ;System.out.println(test); break; 

         case (byte)10: test = 12 ;System.out.println(test); 

         default: test = 0 ;

        } 

总结 if、if-else、if-else if-else语句 与 switch 开关语句 之间的异同点: 

1、if、if-else、if- else if- else 语句 之间的共同点是程序根据 一个条件执行一个分支操作,而不是选择执行多个分支操作; 

2、与上面 if、if-else、if- else if- else 语句 不同的是, 在switch语句中,可以通过合理地使用 break 语句,达到一个条件执行一个分支的操作(即只执行一个case后面的若干语句),也可以达到多个操作的操作(即执行多个case后面的若干语句,如以上第2点的代码演示); 

代码练习: 使用switch语句实现 判断用户从键盘输入一个整数是否为中奖号码; 

      System.out.println("请输入一个整数进行抽奖,并按回车键(Enter)结束输入:");

        Scanner inputs = new Scanner(System.in);

        int number = inputs.nextInt();

        switch(number){

         case 11: System.out.println("恭喜中特等奖!中奖号码为:"+number);break;

         case 12: 

         case 13: System.out.println("恭喜中一等奖!中奖号码为:"+number);break;

         case 14:

         case 15:

         case 19: System.out.println("恭喜中二等奖!中奖号码为:"+number);break;

         case 22:

                 case 23:

                 case 24:

         case 25: System.out.println("恭喜中三等奖!中奖号码为:"+number);break;

         default: System.out.println("很遗憾"+number+"没有中奖");

        } 

其中:特等奖为一名,一等奖为两名,二等奖为三名,三等奖为四名;

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Go语言GC实现原理及源码分析
在垃圾收集器开始工作时,从 GC Roots 开始进行遍历访问,访问步骤可以分为下面几步:
luozhiyun
2021/03/21
1.4K0
Golang源码探索----GC的实现原理(5)
gcDrain函数扫描完根对象, 就会开始消费标记队列, 对从标记队列中取出的对象调用scanobject函数:
李海彬
2020/12/03
7990
Golang源码探索----GC的实现原理(4)
gcMarkTinyAllocs函数会标记所有tiny alloc等待合并的对象:
李海彬
2020/12/03
1.1K0
GC实现原理学习笔记
span中有一个freeindex标记下一次分配对象时应该开始搜索的地址, 分配后freeindex会增加, 在freeindex之前的元素都是已分配的, 在freeindex之后的元素有可能已分配, 也有可能未分配.
用户7962184
2020/11/20
6590
GC实现原理学习笔记
Golang源码探索----GC的实现原理(2)
freelarge的类型是mTreap, 调用remove函数会在树里面搜索一个至少npage且在树中的最小的span返回:
李海彬
2020/12/03
7100
Golang源码探索----GC的实现原理(2)
超干货!彻底搞懂Golang内存管理和垃圾回收
导语 | 现代高级编程语言管理内存的方式分自动和手动两种。手动管理内存的典型代表是C和C++,编写代码过程中需要主动申请或者释放内存;而Java和Go等语言使用自动的内存管理系统,由内存分配器和垃圾收集器来代为分配和回收内存,开发者只需关注业务代码而无需关注底层内存分配和回收,虽然语言帮我们处理了这部分,但是还是有必要去了解一下底层的架构设计和执行逻辑,这样可以更好的掌握一门语言,本文主要以go内存管理为切入点再到go垃圾回收,系统地讲解了go自动内存管理系统的设计和原理。 一、TCMalloc go内存
腾讯云开发者
2022/07/19
6K0
超干货!彻底搞懂Golang内存管理和垃圾回收
Golang源码探索----GC的实现原理(6)
从bgsweep和前面的分配器可以看出扫描阶段的工作是十分懒惰(lazy)的, 实际可能会出现前一阶段的扫描还未完成, 就需要开始新一轮的GC的情况, 所以每一轮GC开始之前都需要完成前一轮GC的扫描工作(Sweep Termination阶段).
李海彬
2020/12/03
5700
Golang源码探索----GC的实现原理(6)
从源码剖析Go语言基于信号抢占式调度
在 Go 的 1.14 版本之前抢占试调度都是基于协作的,需要自己主动的让出执行,但是这样是无法处理一些无法被抢占的边缘情况。例如:for 循环或者垃圾回收长时间占用线程,这些问题中的一部分直到 1.14 才被基于信号的抢占式调度解决。
luozhiyun
2021/03/29
1.2K0
2万字深入分析GC源码和实现原理
本文通过详细分析Go中GC源码,深入了解其实现原理细节,分析的Go版本为1.14。我们知道Go垃圾回收采用的是标记清扫算法,根据算法名也可以猜到有标记和清扫两个过程,这是逻辑上的划分。在工程层面,具体实现的时候需要做一些其他工作,例如过渡阶段的处理。根据mgc.go注解的说明,GC一共分为4个阶段:
数据小冰
2022/08/15
1.3K0
2万字深入分析GC源码和实现原理
Golang GC 从原理到优化
这篇文章与笔者之前所写几篇不同,是一篇综述型的文章,将从 GC 理论、在 Golang 中的应用、以及如何去做优化,这三个角度逐次进行阐述,文章中对于一些技术点会引用到多篇文章,希望读者也都能进行阅读,这有助于更全面的了解 Golang GC。
薯条的编程修养
2023/01/30
2.7K1
聊聊两个Go即将过时的GC优化策略
这篇文章本来是要讲 Go Memory Ballast 以及 Go GC Tuner 来调整 GC 的策略,实现原理怎么样,效果如何。但是在写的过程中,发现 Go 1.19版本出了,有个新特性让这两个优化终究成为历史。
luozhiyun
2022/09/28
1.2K0
聊聊两个Go即将过时的GC优化策略
Golang源码探索----GC的实现原理(1)
Golang从1.5开始引入了三色GC, 经过多次改进, 当前的1.9版本的GC停顿时间已经可以做到极短. 停顿时间的减少意味着"最大响应时间"的缩短, 这也让go更适合编写网络服务程序. 这篇文章将通过分析golang的源代码来讲解go中的三色GC的实现原理.
李海彬
2020/12/03
1.4K0
Golang源码探索----GC的实现原理(1)
手摸手Go 深入剖析sync.Pool
如果能够将所有内存都分配到栈上无疑性能是最佳的,但不幸的是我们不可避免需要使用堆上分配的内存。我们可以优化使用堆内存时的性能损耗吗?答案是肯定的。Go同步包中,sync.Pool提供了保存和访问一组临时对象并复用它们的能力。
用户3904122
2022/06/29
8880
手摸手Go 深入剖析sync.Pool
golang源码分析(8):m、p、g、shedt、sudog
go的调度器只要实现在 runtime 包中,路径为: ./src/runtime/proc.go 文件中。
golangLeetcode
2022/08/02
1.2K0
Golang标准库time(2) - timer和ticker
timer也叫定时器,ticker是反复触发的定时器。实际上 timer和ticker 的代码已经基本不在time包里了,主要都都在golang的runtime包里。
后端云
2023/02/10
3710
Golang标准库time(2) - timer和ticker
听GPT 讲Go源代码--mgc.go
mgc.go 是 Go 语言 runtime 包中的一部分,主要负责 Go 语言的垃圾回收机制 (Garbage Collector) 的实现。
fliter
2023/09/06
2480
听GPT 讲Go源代码--mgc.go
实战分析一个运行起来会卡死的Go程序
最近一位非常热心的网友建议结合demo来分析一下goroutine的调度器,而且还提供了一个demo代码,于是便有了本文,在此对这位网友表示衷心的感谢!
阿波张
2019/06/24
4.4K1
深入理解Go GC
GC(Garbage Collection)在计算机科学中是一种自动的存储器管理机制。当一个计算机上的动态存储器不再需要时,就应该予以释放,以让出存储器,这种存储器资源管理,称为GC。GC可以让程序员减轻许多负担,也减少程序员犯错的机会。
公号:咻咻ing
2020/06/16
1.7K0
深入理解Go GC
Golang GC 介绍
GC 全称 Garbage Collection,目前主流的垃圾回收算法有两类,分别是追踪式垃圾回收算法(Tracing garbage collection)和引用计数法( Reference counting )。
恋喵大鲤鱼
2024/02/07
7280
Golang GC 介绍
Golang的垃圾回收
最近垃圾分类的话题热度一下子就上去了,很多人因为垃圾分类的问题很头痛。因为垃圾这个话题,那我就想来说说Golang里面的垃圾,于是就有了这篇博客,golang中的垃圾回收。
LinkinStar
2022/09/01
6830
Golang的垃圾回收
相关推荐
Go语言GC实现原理及源码分析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档