3、goto和跳转

对于goto,中庸之道是最好的解决方法。真正的问题并不在于使用goto,而在于goto的滥用;而且少数情况下,goto还是组织控制流程的最佳手段。

尽管goto仍是Java中的一个保留字,但在语言中并未使用它;Java没有goto。然而Java也能完成一些类似于跳转的操作,这与break和continue这两个关键词有关。它们其实不是一个跳转,而是中断迭代语句的一种方法。之所以把它们纳入goto问题中一起讨论,是由于它们使用了相同的机制:标签。

 

在Java中,标签起作用的唯一的地方刚好是在迭代语句之前。“刚好之前”的意思表明,在标签和迭代之间置入任何语句都不好。而在迭代之前设置标签的唯一理由是:我们邪王在其中嵌套另一个迭代或者一个开关。这是由于break和continue关键词通常只中断当前循环,但若随同标签一起使用,它们就会中断循环,直到标签所在的地方。

 

 

label1:
outer
-iteration {
    inner
-iteration {
        
//...
        break//(1)
        
//...
        continue//(2)
        
//...
        continue label1; //(3)
        
//...
        break label1; //(4)
    }
}

 

在(1)中,break中断内部迭代,回到外部迭代。

在(2)中,continue使执行点移回内部迭代的起始处。

在(3)中,continue label1同时中断内部迭代以及外部迭代,直接转到label1出;随后,它实际上是继续迭代过程,但却从外部迭代开始。 

在(4)中,break label1也会中断所有迭代,并回到label1处,但并不重新进入迭代。也就是说,它实际上是完全中止了两个迭代。

 

1)一般的continue会退回最内层循环的开头(顶部),并继续执行。

2)带标签的continue会到达标签的位置,并重新进入紧接在那个标签后面的循环。

3)一般的break会中断并跳出当前循环。

4)带标签的break会中断并跳出标签所指的循环。

posted @ 2010-02-04 16:20  Derek_nr  阅读(374)  评论(0)    收藏  举报