第一章 流程控制

 

1_1_9_01_ 流程控制概述

在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的。也就是说,程序的流程对运行结果有直接的影响。所以,我们必须清楚每条语句的执行流程。而且,很多时候我们要通过控制语句的执行顺序来实现我们要完成的功能。

流程有三种:顺序结构,选择结构,循环结构

1_1_9_01_ 顺序结构

// 顺序结构
public class Demo01Sequence {
	public static void main(String[] args) {
		System.out.println("今天天气不错");
		System.out.println("挺风和日丽的");
		System.out.println("我们下午没课");
		System.out.println("这的确挺爽的");
	}
}

1_1_9_ 判断结构

1_1_9_02_ 判断语句1–if

  1. if 语句第一种格式: if

    if(关系表达式){
       语句体;
  2. 执行流程

  • 首先判断关系表达式看其结果是 true还是false
  • 如果是 true就执行语句体
  • 如果是 false就不执行语句体

单if语句的逻辑 是 :执行语句体,或者不执行他

// 单if语句
public class Demo02If {
	public static void main(String[] args) {
		System.out.println("今天天气不错,正在压马路……突然发现一个快乐的地方:网吧");
		int age = 19;
        //or int age = 16;那就只打印两句话
		if (age >= 18) {
			System.out.println("进入网吧,开始high!");
			System.out.println("遇到了一群猪队友,开始骂街。");
			System.out.println("感觉不爽,结账走人。");
		}
		System.out.println("回家吃饭");
	}
}

1_1_9_03_ 判断语句2–if…else

  • if 语句第二种格式: if…else
if(关系表达式) {
   语句体1;  
}else {
   语句体2;  
}
  • 执行流程
  1. 首先判断关系表达式看其结果是 true还是false
  2. 如果是 true就执行语句体1;
    如果是 false就执行语句体2。

加图

if…else 的逻辑是二者选其一

// 标准的if-else语句
public class Demo03IfElse {
    // 判断给定的数据是奇数还是偶数
	public static void main(String[] args) {
		int num = 666;
		
        //奇偶性是看余数决定的,余数得用%看 ,➗(/)只能看商
		if (num % 2 == 0) { 
            // 如果除以2能够余数为0,说明是偶数
			System.out.println("偶数");
		} else {
			System.out.println("奇数");
		}
        System.out.println("结束");
	}
}

1_1_9_04_ 拓展的判断语句3–if…else if…else

  • if 语句第三种格式: if…else if …else
if (判断条件1) {
   执行语句1;  
} else if (判断条件2) {
   执行语句2;  
}
...
}else if (判断条件n) {
  执行语句n;   
} else {
   执行语句n+1;  
}
  • 执行流程

加图

首先判断关系表达式 1看其结果是true还是false
如果是 true就执行语句体1
如果是 false就继续判断关系表达式2看其结果是true还是false
如果是 true就执行语句体2
如果是 false就继续判断关系表达式…看其结果是true还是false

如果没有任何关系表达式为 true,就执行语句体n+1。

if…else if…else的逻辑是N者选其一

public static void main(String[] args) {
    // x和y的关系满足如下:
    // x>=3 :y = 2x + 1;
    // ‐1 <= x < 3 :y = 2x;
    // x<= ‐1 :y = 2x – 1;
    // 根据给定的x的值,计算出y的值并输出。
    // 定义变量
    int x = 2;//结果y的值是4
    //int x = 5;//结果y的值是11
    //int x = -10;//结果y的值是-21
    int y;
    if (x>= 3) {
       y = 2 * x + 1;  
    } else if (x >= ‐1 && x < 3) {
        //else if(-1<x<3)错误
       y = 2 * x;  
    } else  {
       y = 2 * x ‐ 1;  
    }
    System.out.println("结果y的值是"+y);
}

1_1_9_05_ 判断语句练习

public static void main(String[] args) {   
    int score = 100;
    if(score<0 || score>100){
       System.out.println("你的成绩是错误的");  
    }else if(score>=90 && score<=100){
       System.out.println("你的成绩属于优秀");  
    }else if(score>=80 && score<90){
       System.out.println("你的成绩属于好");  
    }else if(score>=70 && score<80){
       System.out.println("你的成绩属于良");  
    }else if(score>=60 && score<70){
       System.out.println("你的成绩属于及格");  
    }else {
       System.out.println("你的成绩属于不及格");  
    }  
}

1_1_9_07_ 选择结构

switch(表达式的值) {
  case 常量值1:
    语句体1;
    break;
  case 常量值2:
    语句体2;
    break;
  ...
  default:
    语句体n+1;
    break;
}
  • 首先计算出表达式的值
  • 其次,和 case依次比较,一旦有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结束。
  • 最后,如果所有的case都和表达式的值不匹配,就会执行default语句体部分,然后程序结束掉。
    🐖注:case break 可以多次出现。
    🐖注:如果没有相匹配的 case 标签 , 而有default 子句, 就执行这个子句

🈲Switch警告

1.直通的情况

2.多个case后面的数值(标签值)不可以重复

3.switch后面小括号当中只能是下列数据类型:

基本数据类型:byte/short/char/int
引用数据类型:String字符串(JDK1.7后支持)、enum枚举

🈴Switch+枚举常量

当在 switch 语句中使用枚举常量时, 不必在每个标签中指明枚举名 ,可以由 switch 的表达式值确定。
例如 :

Size sz = . . . ;
switch ( sz )
{
	case SMALL : // no need to use Size . SMALL
		break ;

🌈switch语句格式可以很灵活:前后顺序可以颠倒,而且break语句还可以省略。

🈚墙裂建议default+break

default:
	System.out.println("数据不合理");
	break;//最后一个break语句可以省略,但是强烈推荐不要省略。因为保持格式一致。

🥩Switch的穿透

“匹配哪一个case就从哪一个位置向下执行,直到遇到了break或者整体结束为止。”

所以推荐default+break,因为一旦不带break的dafault移动到上面了,就会通过default向下穿透

1_1_9_08_ 循环结构小节

摘自Java核心卷 第3章Java 的基本程序设计结构 79

3.10.1 for each 循环

Java 有一种功能很强的循环结构 , 可以用来依次处理数组中的每个元素 ( 其他类型的元素集合亦可 ) 而不必为指定下标值而分心 。
这种增强的 for 循环的语句格式为 :

for ( variable : collection ) statement

定义一个变量用于暂存集合中的每一个元素 ,并执行相应的语句( 当然也可以是语句块 ) 。collection 这一集合表达式必须是一个数组或者是一个实现了 Iterable 接口的类对象 ( 例如ArrayList ) 。 有关数组列表的内容将在第 5 章中讨论 , 有关 Iterable 接口的内容将在第 9 章中讨论。
例如,

for ( int element : a )
System.out.println(element);

打印数组 a 的每一个元素 , 一个元素占一行。

这个循环应该读作 “ 循环 a 中的每一个元素 ” ( for each element in a ) 。 Java 语言的设计者认为应该使用诸如 foreach 、 in 这样的关键字, 但这种循环语句并不是最初就包含在 Java 语言中的, 而是后来添加进去的 , 并且没有人打算废除已经包含同名 ( 例如 System.in) 方法或变量的旧代码。
当然, 使用传统的 for 循环也可以获得同样的效果 :

for ( int i = 0 ; i < a . length ; i + + )
System . out . println ( a [ i ] ) ;

但是, for each 循环语句显得更加简洁 、 更不易出错 ( 不必为下标的起始值和终止值而操心 ) 。
🥘注释 : foreach 循环语句的循环变量将会遍历数组中的每个元素 , 而不需要使用下标值 。
如果需要处理一个集合中的所有元素 , for each 循环语句对传统循环语句所进行的改进更是叫人称赞不已。 然而,在很多场合下,还是需要使用传统的for 循环,例如,如果不希望遍历集合中的每个元素,或者在循环内部需要使用下标值等。
🔊提示 : 有个更加简单的方式打印数组中的所有值,即利用 Arrays 类的toString 方法。调用 Arrays.toString ( a ) , 返回一个包含数组元素的字符串 , 这些元素被放置在括号内,并用逗号分隔 , 例如 ,“[ 2 , 3 , 5 , 7,11,13 ] ” 、 要想打印数组, 可以调用System . out . println ( Arrays . toString ( a ) );