无条件分支控制

在java的控制执行流程中,条件控制分支包括if-else、while、do-while、for,而无条件分支控制包括return、break和continue。
下面简述无条件分支控制:java

在java中有多个关键词表示无条件分支,它们只是表示这个分支无需任何测试便可发生。这些关键字包括return、break和continue和一种与其余语言中的goto相似的跳转到标号语句的方式。
return关键字有两个方面的用途:
①它指定一个方法返回什么值(假定它没有void返回值)。
②它会致使当前的方法退出,并返回那个值。测试

//如下是它的一个简单的测试:code

public class IfElse {
static int test(int value, int target) {
if (value > target)
return 1;
else if (value < target)
return -1;
else
return 0;
}get

public static void main(String[] args) {
    System.out.println(test(10, 5));
    System.out.println(test(5, 10));
    System.out.println(test(5, 5));
}

}源码

若是在返回 void 的方法中没有 return 语句,那么在该方法的结尾处会有一个隐式的人 retrun ,所以在方法中并不是老是必需要有一个 return 语句。可是,若是一个方法声明它将返回 void 以外的其它东西,那么必须确保每一条代码路径都将返回一个值。it

在任何迭代语句的主体部分,均可以用 break 和 continue 控制循环的流程。其中,break 用于强行退出循环,不执行循环中剩余的语句。而 continue 则中止执行当前的迭代,而后退回循环的起始处,开始下一次迭代。
//如下是它的一个简单测试io

public static void main(String[] args) {
    for (int i = 0; i < 100; i++) {
        if (i == 74)  break;
        if (i % 9 != 0)  continue;
        System.out.print(i + " ");
    }
}

/*输出:
0 9 18 27 36 45 54 63 72for循环

循环从0开始,0不符合两个 if 布尔判断,因而直接打印值。递增以后到1,1符合第二个布尔值判断,执行 continue 语句,它跳过 continue 以后的内容,进入下一轮循环,即进入递增到2的循环,因此,i的值为1的状况不进行打印输出。余下状况以此类推,当 i 的值增加到74时,执行 break 语句,该循环终止,执行方法中循环体如下的其它代码,如打开以上被注释的代码则它将会被执行。
在这个循环中,i 的值永远都不会达到100,由于一旦 i 到达74,break 语句就会中断循环。
continue 语句执行序列移回到循环的开头,而没有去完成 continue 语句以后的全部内容。class

带 goto 跳转功能的控制
因为 goto 语句是在源码级上的跳转,一个程序老是从一个地方跳到另外一个地方,还有什么办法能识别程序的控制流程呢?
java 没有 goto,可是java也能完成一些相似于一些跳转的操做,这与 break 和 continue 这两个关键字有关。
标签:标签是后面跟有冒号的标识符,就像这样:label2
在java中,标签起做用的惟一地方恰好是在迭代语句以前。
label1:
outer-iteration {
inner-iteration {
//...
break; //①
//...
continue; //②
//...
continue label1; //③
//...
break label1; //④
}
}test

在①中,break 中断内部迭代,回到外部迭代。
在②中,continue 使执行点移回内部迭代的起始处。
在③中,continue label1 同时中断内部迭代以及外部迭代,直接转到 label1 处;随后,它实际上继续迭代过程,但却从外部迭代开始。
在④中,break label1 也会中断全部迭代,并回到 label1 处,但并不从新进入迭代。也就是说,它其实是彻底终止了两个迭代。

代码实例:

public static void main(String[] args) {
    int i = 0;
    outer:
        for(;true;){
            inner:
                for(;i<10;i++){
                    System.out.println("i=" + i);
                    if(i == 2){
                        System.out.println("continue");
                        continue;
                    }
                    if(i == 3){
                        System.out.println("break");
                        i++;
                        break;
                    }
                    if(i == 7){
                        System.out.println("continue outer");
                        i++;
                        continue outer;
                    }
                    if(i == 8){
                        System.out.println("break outer");
                        break outer;
                    }
                    for(int k = 0; k < 5; k++){
                        if(k == 3){
                            System.out.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

注意,break 会中断for循环,并且在抵达for循环的末尾以前,递增表达式不会执行。因为break跳过了递增表达式,因此在i == 3 的状况下直接对i执行递增运算。在 i==7的状况下,continue outer 语句会跳到循环顶部,并且也会跳过递增,因此这里也对i直接递增。
若是没有break outer 语句,就没有办法从内部循环里跳出外部循环。这是因为break自己只能中断最内层的循环(continue一样也是如此)。

总结:
1)通常的continue会退回最内层循环的开头(顶部),并继续执行。
2)带标签的continue会到达标签的位置,并从新进入紧接在那个标签后面的循环。
3)通常的break会中断并跳出当前循环。
4)带标签的break会中断并跳出标签所指的循环。
重点是:在java里须要使用标签的惟一理由就是由于有循环嵌套存在,并且想从多层嵌套中break或continue。

////end

相关文章
相关标签/搜索