[Thinking in Java]第4章-控制执行流程

4.1 if-else
4.2 迭代
4.3 Foreach语法
4.4 return
4.5 break和continue
4.6 switch

目录


4.1 if-else

if-else中的else是可选的,有两种形式使用if:

if (Boolean-expression)
  statement

if (Boolean-expression)
  statement1
else
  statement2

需要注意的是,Boolean-expression不能是数字,其实后面的while,for中的条件表达式都不能是数字,尽管我们知道C和C++可以用数字来判断true或false

 1 char test(int score) {
 2     if (score >= 90)
 3         return ‘A‘;
 4     else if (score >= 80)
 5         return ‘B‘;
 6     else if (score >= 70)
 7         return ‘C‘;
 8     else if (score >= 60)
 9         return ‘D‘;
10     else //if (score < 60)
11         return ‘E‘;
12 }

上面的例子中,如果去掉第10行的注释,编译器就会报错,尽管我们能理解设计者的用意,但是编译器可没这么聪明,编译器以为第10行之后不会返回值

4.2 迭代(while、do-while、for)

之所以说while、do-while和for语句是迭代语句,是因为它们的语句会重复执行,直到起控制作用的布尔表达式得到“假”的结果为止。

while的循环格式如下:

while (Boolean-expression)
  statement

do-while的循环格式如下:

do
  statement
while (Boolean-expression);// 不要忘了分号;

NOTE:while和do-while唯一的区别就是do-while中的语句至少会执行一次,即便表达式第一次就被计算为false。而在while循环结构中,如果条件第一次就为false,那么其中的语句根本就不会执行。

for循环的格式如下:

for (initialization; Boolean-expression; step)
  statement

其实相当于while循环:

initialization
while (Boolean-expression) {
  statement
  step
}

初始化表达式(initialization)、布尔表达式(Boolean-expression)和步进运算(step)都可以为空

逗号操作符(不是逗号分隔符)

Java里唯一用到逗号操作符的地方就是for循环的控制表达式。在控制表达式的初始化和步进控制部分,可以使用一系列由逗号分隔的语句;而且那些语句均会独立运行

public class CommaOperator {
    public static void main(String[] args) {
        for (int i = 1, j = i + 10; i < 5; i++, j = i * 2) {
            println("i = " + i + "j = " + j);
        }
    }
}/*
i = 1 j = 11
i = 2 j = 4
i = 3 j = 6
i = 4 j = 8
*/

for语句中的int定义覆盖了i和j,在初始化部分实际上可以拥有任意数量的具有相同类型的变量定义。在一个控制表达式中,定义多个变量的这种能力只限于for循环适用,在其他任何选择语句中都不能使用这种方式。

可以看到,无论在初始化还是步进部分,语句都是顺序执行的。此外,初始化部分可以有任意数量的同一类型的定义。

4.3 Foreach语法

foreach访问数组和容器时会显得更加简洁和高效,这里展示访问数组的例子

1 int[] a = new int[10];
2 for (int i = 1; i <= 10; i++)
3     a[i - 1] = i;
4 for (int e : a)
5     println(e);

4.4 return

return关键字有两方面的用途:一方面指定一个方法返回什么值(假设不是返回void),另一方面它会导致当前的方法退出,并返回那个值。

改写4.1 if-else中的例子

char test(int score) {
    if (score >= 90)
        return ‘A‘;
    if (score >= 80)
        return ‘B‘;
    if (score >= 70)
        return ‘C‘;
    if (score >= 60)
        return ‘D‘;
    else //if (score < 60)
        return ‘E‘;
}

这样就不必加上else了,因为在return后面的代码不会继续执行

在返回值为void的方法也可以有return,如果没有加上return,那么方法的结尾会有一个默认的隐式的return

void test(int e) {
    if (e == 1)
        return;// 如果e等于1,下面的e++就不会执行了
    e++;
}

4.5 break和continue

break用于强行退出当前循环,不执行剩余的迭代;而continue则停止执行当前的迭代,然后退回循环开始初,继续下一次迭代。

for (int i = 0; i < 100; i++) {
    if (i == 74) break;// 若等于74,退出循环
    if (i % 9 != 0) continue;// 若不是9的整数倍,跳过下面的语句,继续下一次迭代
    println(i + " ");
}

println();
int i = 0;
while (true) {
    i++;
    int j = i * 27;
    if (j == 1269) break;// 若j等于1269,退出循环
    if (i % 10 != 0) continue;// 若i不是10的整数倍,跳过下面的语句,继续下一次迭代
    println(i + " ");
}

break和continue也可以像goto关键字那样使用标签,不过还是少用好一点。格式如下

label1://标签,注意千万不可在label1和outer-iteration之间写任何代码
outer-iteration {//外部迭代
    inner-iteration {//内部迭代
        // ...
        break;// (1)
        // ...
        continue;// (2)
        // ...
        continue label1;// (3)
        // ...
        break label1;// (4)
    }
}

在(1)中,break中断内部迭代(inner-iteration),回到外部迭代(outer-iteration);

在(2)中,continue跳过下面的语句,回到内部迭代(inner-iteration)的起始处,继续下一次内部迭代(inner-iteration);

在(3)中,continue label1同时中断内部迭代(inner-iteration)和外部迭代(outer-iteration),直接跳转到label1处,随后它实际上是继续迭代过程,但却是从外部迭代(outer-iteration)开始;

在(4)中,break label1将中断所有迭代,并回到label1除,但不再进入迭代了。

下面这个例子展示了带有标签的break和continue

int i = 0;
outer:
for (; true;) {
    inner:
    for(; i < 10; i++) {
        println("i = " + i);
        if (i == 2) {
            println("continue");
            continue;
        }
        if (i == 3) {
            println("break");
            i++;
            break;
        }
        if (i == 7) {
            println("continue outer");
            i++;
            continue outer;
        }
        if (i == 8) {
            println("break outer");
            break outer;
        }
        for (int k = 0; k < 5; k++) {
            if (k == 3) {
                println("continue inner");
                continue inner;
            }
        }
    }
}/*输出结果

i = 0
continue inner
i = 1
continue inner
i = 2
continue
i = 3
break
i = 4
continue inner
i = 5
continue inner
i = 6
continue inner
i = 7
continue outer
i = 8
break outer
*/

同样的规则也适用于while迭代。

要记住的重点是:在Java里需要使用标签的唯一理由无非因为有循环嵌套存在,而且想方便地从多层嵌套中break和continue

4.6 switch

switch有时也被划归为一种选择语句。根据整数表达式的值,switch语句可以从一系列代码中选出一段去执行。它的格式如下:

switch (integral-selector) {
    case integral-value1 : statement;break;
    case integral-value2 : statement;break;
    case integral-value3 : statement;break;
    // ...
    default: statement;
}

其中,integral-selector(整数选择因子)是一个能够产生数值的表达式,switch能将这个表达式的结果与每个integral-value(整数值)相比较。若发现相符的,就执行对应的语句(单一的语句或多条语句,其中并不需要括号的)。若没有发现相符的,就执行default语句。

在上面的定义中,大家会注意到每个case均以一个break结尾,这样可使执行流程跳转到switch主题的结尾。这是构建switch语句的一种传统方式,但break是可选的。若省略break,会继续执行后面的case语句(如果有的话),直到遇到一个break为止。注意最后的default语句没有break,因为执行流程已到了break的跳转目的地,当然,自己完全可以在default语句的末尾放置一个break,尽管这样做没有任何用处

需要注意的是,switch中的选择因子只能是int或char那样的整数,不能使用字符串或者浮点数

import java.util.*;

public class VowelsAndConsonants {
    public static void main(String[] args) {
        Random random = new Random(1972);
        for (int i = 0; i < 5; i++) {
            int c = random.nextInt(26) + ‘a‘;
            println((char)c + ", " + c + ": ");

            switch (c) {
                case ‘a‘ :
                case ‘e‘ :
                case ‘i‘ :
                case ‘o‘ :
                case ‘u‘ :  println("vowel");
                            break;
                case ‘y‘ :  println("Sometimes a vowel");
                            break;
                default:    println("Consonant");
            }
        }
    }
}

从这个例子,可以看到case语句可以堆叠在一起,为一段代码形成多重匹配。这时也要注意将break语句置与特定的case的末尾,否则控制流程会简单的往下移,处理后面的case

时间: 2024-10-13 01:51:12

[Thinking in Java]第4章-控制执行流程的相关文章

Thinking In Java笔记(第四章 控制执行流程)

第四章 控制执行流程 Java中使用了C的所有流程控制语句.在Java中涉及的关键字包括if-else,while,do-while,for,return,break,continue以及选择语句switch.然而Java不支持goto语句(该语句引起了许多的反对意见),但是Java仍然可以类似goto那样跳转. 4.1 True和False 所有的条件语句都利用条件表达式的真假来决定执行的路径.Java中不允许我们将一个数字作为boolean值使用,虽然C和C++中是允许的("非零"

Java编程思想---第四章 控制执行流程

第四章  控制执行流程 就像有知觉的生物一样,城西必须在执行过程中控制它的世界并作出选择,在Java中,你要使用执行控制语句来作出选择. 4.1 true和false 所有的条件语句都利用条件表达式的真假来决定执行路径.如a==b,它用操作符==来判断a的值是否等于b的值,返回一个true或false. 4.2 if-else if-else语句是控制程序流程的最基本形式,其中else是可选的,所以可以按下面的两种形式来使用: if(Boolean-expression) statement 或

[Java编程思想-学习笔记]第4章 控制执行流程

4.1  return 关键字return有两方面的用途:一方面指定一个方法结束时返回一个值:一方面强行在return位置结束整个方法,如下所示: 1 char test(int score) { 2 if (score >= 90) 3 return 'A'; 4 if (score >= 80) 5 return 'B'; 6 if (score >= 70) 7 return 'C'; 8 if (score >= 60) 9 return 'D'; 10 else //if

Java编程思想:第4章 控制执行流程

4.1 true和false 所有条件语句都用真和假来判断. 4.2 if-else if(bool-exp) statement;  or  if(bool-exp) statement; else statement; 4.3 迭代 while(b){} do{}while(b) for(init;b;step){}init里可以用逗号定义多个初始变量 4.4 Foreach语法 增强for循环  for(T t : 集合/数组){} 4.5 Return 4.6 Break和Continu

《JAVA编程思想》学习笔记——第四章 控制执行流程

true和false 所有条件语句都利用条件表达式的真或假来决定执行路径. if-else if (Boolean-expression) statement 或 if (Boolean-expression) statement else statement 迭代 while, do-while和for来控制循环,有时将他们划分为迭代语句(iteration statement).语句会重复执行,直到起控制作用的布尔表达式(Booleanexpression)得到"假"的结果为止.

《Java编程思想》笔记 第四章 控制执行流程

1.true和false 1.1 if--else if--else, while, do--while 都使用条件表达式的真假来决定执行路径. 1.2 Java不允许数字作为真假判断,C和C++可以非0即真. 2.Math.random() 产生一个double值 [ 0, 1 ) 包括0,不包括1. 3.foreach语法 如for(float x: f){  }  f是一个数组,返回一个数组的方法都可以用foreach 4.return return使当前方法退出,并返回值. 除构造器外任

ThinkingInJava第四章控制执行流程

条件 if(){}else{} if(){}else if(){}else{} 循环(迭代) while(){} do{}while(); for(int i=0:i<100;i++){} for(String s:str){} swith(){ case 0:  :break: } return 1方法的返回值类型2 当前方法的退出 continue 跳过本次循环:不作数? break 结束循环 原文地址:https://www.cnblogs.com/dajingyu/p/9499381.h

java控制执行流程--thinking in java学习

常用的控制执行流程有if-else:迭代while,do-while,for,foreach:return;break,continue;和break,continue配合使用的标签:switch:在过thinking in java这章的过程中,有两个地方又重新认识了一下,来和大家分享.1.return 有两个作用,1.设定一个方法的返回值:2.退出当前方法.因此任何方法都可以使用return语句,在void方法中使用return便是使用return的退出当前方法的作用.而且在返回void的方

《汇编语言》-- 控制执行流程

参考文献: <汇编语言程序设计> ............................................................................................................................................................................................... 控制执行流程学习,程序中遇到无条件分支时,指令指针自动跳转到另一个位置,可以使用