zoukankan      html  css  js  c++  java
  • 无条件分支控制

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

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

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

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

    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 之外的其它东西,那么必须确保每一条代码路径都将返回一个值。

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

    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 72

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

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

    在①中,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

  • 相关阅读:
    c99柔性数组
    Android自定义XML属性以及遇到的命名空间的问题
    [翻译]API Guides
    使用线程实现视图平滑滚动
    [翻译]API Guides
    [翻译]API Guides
    [翻译]Android官方文档
    探究Android中通过继承ViewGroup自定义控件的原理
    初探Android动画之门
    ViewPager、Fragment、Matrix综合使用实现Tab滑页效果
  • 原文地址:https://www.cnblogs.com/understander/p/6848098.html
Copyright © 2011-2022 走看看