前面我们提到了就是有三种基本语句。顺序的,分支的
或循环的,那么在有的语言里面它还有个Goto语句,
这个Goto语句呢,它是有时候用起来时很方便的,就是程序的流程呢
从一个地方直接跳转到另一个地方,在C语言里面
保留了Goto语句。当然在历史上这个Goto语句呢也引起了很大的争论。
就说程序里面究竟要不要Goto语句。
Goto语句呢最大的问题呢就是 程序但流程和我们书写的那个流程呢
执行流程和我们书写流程它不一样,因为它一下就跳转到某个地方去了。
所以带来程序的可读性很差,那么Java语言怎么解决这个问题呢? 它实际上把Goto语句呢给去掉了。
但是呢它有走了一种中间方案,也就说 不是我们完全不要类似于Goto的这样,
它用了一个什么呢?就是我们在循环里面用break或者continue 来直接跳出某个循环或者跳到
某个循环的下支循环,那这个循环呢就我们使得它可以呢
从里层的循环直接呢跳出外层循环, 或者进到外层循环,那么究竟哪一外层循环呢?
它就要用个标号来表示,所以这个标号呢就是一个标示符,然后呢一个冒号,
来表明它是哪层循环。我们看一下 这种呢,当然break语句呢,它平时我们用来呢
比如说在switch里头,我们可以break,表示它
跳出呢这个switch,那在更多的是 这种我们用一个标号,特别这里面呢来表示
它一下就break到哪一层,外面这一层来。那么它这个
有点像Goto的意思。就跳出,但是呢它不能乱跳,它只能从里层循环呢
跳出外层循环,并且每一层呢 这个语句呢,它是用一个标号,什么什么冒号来表示的。
那这个普通的break呢它就跳出这一层循环,如果后面加个标号呢
就可以跳出外层循环。continue呢类似。我们知道continue呢 它是在循环里面呢直接进到下一次循环的意思,
就如果在某种情况下,就直接就进到下次循环。
比如说我们这里这个例子,从1-100,这样i++的循环,
但如果i除以10余数为0的话,
那么它就continue,也就是直接就进到下一层循环,它不执行
后面的语句。这就是简单的说呢,break就是跳出我们的循环, continue呢就是继续到下一次
循环。就这两个呢是特殊的流程控制语句, 那么加上标号以后呢,使得它能够从里面
直接跳出外层循环,所以在一定程度上呢 既避免了像Goto语句这么随意使用
同时呢也保留了比较合理的,就是我们从里层循环 跳出的这样一个合理的这样一种跳转。
那我们这里看一个例子。求100以内的质数,质数呢也叫素数,
就是2,3,5,7,11这样的,只有当1,或自己能够整除。
我们这个程序呢是想求出100以内的质数。
我们下面看一下代码。这个程序呢用了两层循环,
外面的循环呢是,就比如说我们这里是101-200以内的,每加等于2,因为我们只考虑呢
这个基数,就是在这个范围内呢,我们对每一个数呢都要检验。
它是不是质数,那在这个过程当中 我们要检验它是不是质数,要怎么办呢,要从2一直到小于i,
j呢从2到小于i,每一个呢j++进行判断,
所以呢也就是说,对每一个i我们要从2到小于i,也就到2到i-1
去判断它能不能除,如果一旦除尽了, 也就说这个数呢,除尽了余数为0。
它就直接呢就表明这个i啊,我根本就不用判断下一个
比如说有个数它能被5整除,我们就根本就不用判断被6啊,被7啊,被8
就不用再判断了,所以直接continue到外层循环, 就直接进到下一个i,continue
outer 这个呢就相当于Goto到一个外层循环。但是呢它这个continue
outer 这个outer就是这样一个标号,就表明呢是外,是这个循环。
所以用这种方式呢就直接就进到下一次循环,所以这是一个很好的一个语句,很好的一种写法。
然后我们就如果这里面判断没有 都没有被除掉的话,那我们就把它显示出来,显示出来。
然后我们还可以附加一点点功能就是比如说 我们想每10个一换行,那怎么办呢,
那我们就可以呢再加一个变量 表示计数,n呢开始为0,每一显示一个数呢n++
那就相当于计数器了,每一次n++, 如果小于10,就continue,就说
小于10的话就进到下一个去。也就说还不满10个数,
那我们就不做下面的语句。否则的话满了10个我们就做什么 print
line,就是换一下行,然后呢再把n呢重新置为0, 用它来表示呢我们这一行显示了多少数。
所以这个程序呢核心就是双层循环,同时用了一个continue outer,
这样的方式呢来表示直接进到 下一次,外层的下一次循环。另外呢我们也在这里用了一个
计数器。我们看一下运行效果。这就是运行效果 就是我们每显示10个数,然后换一下行。
那就这样的一个过程。