zoukankan      html  css  js  c++  java
  • 控制流程

      Java的控制流程用于使程序按正确的顺序逐步进行,为程序提供了运行方向。分为选择类控制流程和循环类控制流程。

    选择类控制流程

    if-else流程

      if-else流程是最基本的选择类控制流程。格式为:if (expr) statement1; [else statement2;]。expr是逻辑表达式,如果为true,则执行statement1;如果为false则不执行,如果有else子句,则执行statement2。

      默认情况下else子句会与最近的if子句配对,可以使用“{ }”来表示else子句与哪一个if子句匹配。例如:

     1 @Test
     2 void testIfelse() {
     3     int a = 6, b = 7;
     4     if (a < 0) 
     5         if (a < b) 
     6             a = b;
     7         else    // 与if (a < b)配对
     8             b = a;
     9     System.out.println("a = " + a);
    10     System.out.println("b = " + b);
    11     System.out.println();
    12     a = 6;
    13     b = 7;
    14     if (a < 0) {
    15         if (a < b) 
    16             a = b;
    17     }
    18     else    // 与if (a < 0)配对
    19         b = a;
    20     System.out.println("a = " + a);
    21     System.out.println("b = " + b);
    22 }
    testIfelse

      输出结果:

      

      很明显,第一个if-else流程的else子句与if (a < b)配对;为了使else子句与if (a < 0)配对,需要加入“{ }”。

      if-else流程有两种嵌套:

      1.if (expr1) statement1;  else if (expr2) statement2;  else statement3;

      2.if (expr1) { if (expr2) statement1; else statement2;}  else statement3;

    switch流程

      switch流程适用于多种选择的情况。格式为:switch (expr) { case val1 : statement1;  case val2 : statement2; ... [default : statement3;]}

      switch根据表达式expr的值选择对应的case块,如果没有一个case块与之匹配且有default块,则进入default块。

      switch中case块或default块需要用break语句来退出程序,如果该程序块是switch的最后一个块则不用break语句。

      default块可以放在任何位置,并不一定是在最后,但通常情况下default块都放在最后。

      欲使得多个case块执行同一段程序,则只需声明前面几个case块,再最后一个case块写入程序。

      switch有一个特点:在一个case块中声明的变量只能在该case块中使用,但是在其他case块不能声明同名变量。

     1 @Test
     2 void testSwitch() {
     3     String s = "Mon";
     4     String str;
     5     switch (s) {
     6         case "Mon" : 
     7             str = "Monday";
     8             break;
     9         case "Tue" : 
    10             str = "Tuesday";
    11             break;
    12         case "Wed" : 
    13             str = "Wednesday";
    14             break;
    15         case "Thu" : 
    16             str = "Thursday";
    17             break;
    18         case "Fri" : 
    19             str = "Friday";
    20             break;
    21         case "Sat" : 
    22             str = "Saturday";
    23             break;
    24         case "Sun" : 
    25             str = "Sunday";
    26             break;
    27         default : 
    28             str = "No Result";
    29     }
    30     System.out.println(str);
    31 }
    testSwitch

      输出结果:

      

      JDK12版本新增了一种switch表达式,使得switch语句的格式变得更加美观。格式为:switch (expr) { case val1 -> {statement1;} case val2 -> {statement2;} ... [default -> {statementN;}]}

      switch表达式会根据expr的值执行对应的case块后面“{ }”括起来的语句,没有与之匹配的case块,若存在default块,则执行default块。

      由于用“{ }”括起了每一块的语句,无需再使用break语句来退出程序。如果只有一个语句可不加“{ }”。

      switch表达式允许一个case块有多个值,只需要用“,”将各个值分开即可。表示当expr为这些值的其中之一时执行该case块。

      上面的程序使用switch表达式可以改为:

     1 @SuppressWarnings("preview")
     2 @Test
     3 void testSwitch() {
     4     String s = "Mon";
     5     String str;
     6     switch (s) {
     7         case "Mon" -> str = "Monday";
     8         case "Tue" -> str = "Tuesday";
     9         case "Wed" -> str = "Wednesday";
    10         case "Thu" -> str = "Thursday";
    11         case "Fri" -> str = "Friday";
    12         case "Sat" -> str = "Saturday";
    13         case "Sun" -> str = "Sunday";
    14         default -> str = "No Result";
    15     }
    16     System.out.println(str);
    17 }
    testSwitch

      输出结果:

      

      switch表达式可以直接返回值。格式为:type value = switch (expr) { case val1 -> value1; case val2 -> value2; ... default -> valueN;};

      上面的程序可以再改的更加美观:

     1 @SuppressWarnings("preview")
     2 @Test
     3 void testSwitch() {
     4     String s = "Mon";
     5     String str = switch (s) {
     6         case "Mon" -> "Monday";
     7         case "Tue" -> "Tuesday";
     8         case "Wed" -> "Wednesday";
     9         case "Thu" -> "Thursday";
    10         case "Fri" -> "Friday";
    11         case "Sat" -> "Saturday";
    12         case "Sun" -> "Sunday";
    13         default -> "No Result";
    14     };
    15     System.out.println(str);
    16 }
    testSwitch

      输出结果:

      

    循环类控制流程

      循环类控制流程的作用是,由循环初始、循环迭代、循环结束三部分控制,重复执行循环体。

    for流程

      for流程的格式为:for (初始; 结束; 迭代) { 循环体 }

      初始部分和迭代部分可以用“,”隔开多个部分,而结束部分是一个逻辑表达式,用于判断结束循环的时机。

      可以在初始部分中声明变量,该变量只能在当前for流程中使用。

    foreach流程

      foreach流程是一种增强的for流程,适用于数组或Collection类对象的遍历。格式为:for (type item : items) { 循环体 }

      items是数组或Collection类对象,而item代表items的元素,所以item的类型type为items中的元素类型。

    while流程

      while流程的格式为:初始;   while (结束) { 循环体;  迭代;}

      进入while流程时会先进行一次结束判断,为true才进入循环。

    do-while流程

      do-while流程的格式为:初始;  do { 循环体;  迭代;} while (结束);

      进入do-while流程时会先进行一次循环,再进行结束判断。

    区别

      for流程和while流程都是先判断后执行,而do-while流程是先执行后判断。例如:

     1 @Test
     2 void testCirculation() {
     3     int i;
     4     // for
     5     for (i = 0; i < 0; i++) ;
     6     System.out.println("for流程:" + i);
     7     // while
     8     i = 0;
     9     while (i < 0) {
    10         i++;
    11     }
    12     System.out.println("while流程:" + i);
    13     // do-while流程
    14     i = 0;
    15     do {
    16         i++;
    17     } while (i < 0);
    18     System.out.println("do-while流程:" + i);
    19 }
    testCirculation

      输出结果:

      

      for流程和while流程都是先判断,由于i<0为false,不进入循环,未执行i++语句,所以输出的i的值都是初始值0。而do-while流程是先执行,所以会执行一次i++语句,所以输出的i的值是1。

    退出流程

      可以使用break和continue语句来退出流程。

      break语句是退出整个循环流程;continue语句是退出当前循环,进入下一次循环。

      Java允许在循环程序块前使用标号标识,然后在break语句或continue语句后使用该标号,表示退出该循环。该方法一般在需要退出多层循环时使用。例如:

     1 @Test
     2 void testLabel() {
     3     int i = 0, j = 0;
     4     for (i = 0; i < 3; i++) 
     5         for (j = 0; j < 5; j++) {
     6             if (j == 2) break;
     7         }
     8     System.out.println("i = " + i);
     9     System.out.println("j = " + j);
    10     System.out.println();
    11     outer : for (i = 0; i < 3; i++) 
    12         for (j = 0; j < 5; j++) {
    13             if (j == 2) break outer;
    14         }
    15     System.out.println("i = " + i);
    16     System.out.println("j = " + j);
    17 }
    testLabel

      输出结果:

      

      第一段for流程中的break语句退出的是内层的for流程,所以外层的for流程会继续执行,直到i=3为止。而第二段for流程中的break语句退出的是标有outer标号的for流程,即外层的for流程,所以i=0。

  • 相关阅读:
    hdu 1269 迷宫城堡 (并查集)
    hdu 1272 小希的迷宫 (深搜)
    hdu 1026 Ignatius and the Princess I (深搜)
    hdu 1099 Lottery
    hdu 1068 Girls and Boys (二分匹配)
    几个基础数位DP(hdu 2089,hdu 3555,uestc 1307 windy 数)
    hdu 1072 Nightmare (广搜)
    hdu 1398 Square Coins (母函数)
    hdu 1253 胜利大逃亡 (深搜)
    hdu 1115 Lifting the Stone (求重心)
  • 原文地址:https://www.cnblogs.com/lqkStudy/p/10987961.html
Copyright © 2011-2022 走看看