C语言中的goto语句:
C 语言中的 goto 语句允许把控制无条件转移到同一函数内的被标记的语句。
优点:goto 语句一个很好的作用是退出深嵌套例程;
消除 goto 会导致一些额外的测试被执行。一 个简单的 break 语句在这里不会起到作用,因为它只会使程序退出最内层循环。
for(...) {
for(...) {
while(...) {
if(...) goto stop;
.
.
.
}
}
}
stop:
注意:在任何编程语言中,都不建议使用 goto 语句。因为它使得程序的控制流难以跟踪,使程序难以理解和难以修改。任何使用 goto 语句的程序可以改写成不需要使用 goto 语句的写法。
在这里,label 可以是任何除 C 关键字以外的纯文本,它可以设置在 C 程序中 goto 语句的前面或者后面。
往前跳转
goto label;
..
.
label: statement;
往后跳转:
label:
..
.
goto label;
statement;
#include <stdio.h>
int main ()
{
/* 局部变量定义 */
int a = 10;
/* do 循环执行 */
LOOP:do
{
if( a == 15)
{
/* 跳过迭代 */
a = a + 1;
goto LOOP;
}
printf("a 的值: %d\n", a);
a++;
}while( a < 20 );
return 0;
}
/*
a 的值: 10
a 的值: 11
a 的值: 12
a 的值: 13
a 的值: 14
a 的值: 16
a 的值: 17
a 的值: 18
a 的值: 19
*/
Java中如何跳出当前的多重循环:
第一种跳出循环的方式是使用一个标记变量,然后在每一层循环中检查这个变量,如果设置为true,则跳出每层循环。具体代码如图。
public class Test{
public static void main(String[] args){
boolean flag = false;
int i=0;
int j=0;
int k=0;
for(i=0;i<100;i++){
for(j=0;j<1000;j++){
for(k=0;k<100;k++){
if(i==0&&j==0&&k==10){
System.out.println("跳出多层循环");
flag = true;
break;
}
}
if(flag){
break;
}
}
if(flag){
break;
}
}
System.out.println("跳出循环后:i="+i+",j="+j+",k="+k);
}
}
//跳出多层循环
//跳出循环后:i=0,j=0,k=0
第二种方法是通过异常捕获的方式跳出多层循环,在想要跳出的位置抛出一个异常,然后用catch捕获该异常。
public class Test{
public static void main(String[] args){
//boolean flag = false;
int i=0;
int j=0;
int k=0;
try{
for(i=0;i<100;i++){
for(j=0;j<1000;j++){
for(k=0;k<100;k++){
if(i==0&&j==0&&k==10){
throw new Exception("跳出多层循环");
}
}
}
}
}catch (Exception e){
System.out.println(e.getMessage());
}
System.out.println("跳出循环后:i="+i+",j="+j+",k="+k);
}
}
//跳出多层循环
//跳出循环后:i=0,j=0,k=10
第三种是使用带标签的break语句跳出循环,在循环前设置一个标签变量,然后在需要跳出的循环处使用 break 标签变量,从而跳到了标签定义的位置,
java中的保留关键字其中有 goto 和 const,但是这两个是目前无法使用的关键字,因此有些地方将其称之为保留字,其实保留字这个词应该有更广泛的意义,因为熟悉 C 语言的程
序员都知道,在系统类库中使用过的有特殊意义的单词或单词的组合都被视为保留字。
public class Test{
public static void main(String[] args){
// boolean flag = false;
int i=0;
int j=0;
int k=0;
loop1: for(i=0;i<100;i++){
for(j=0;j<1000;j++){
for(k=0;k<100;k++){
if(i==0&&j==0&&k==10){
System.out.println("跳出多层循环");
break loop1;
}
}
}
}
System.out.println("跳出循环后:i="+i+",j="+j+",k="+k);
}
}
//跳出多层循环
//跳出循环后:i=0,j=0,k=10
标签变量可以配合 break 和 continue 使用,只要进入循环,就会直接终止整个循环,实现了我们想要的结果。
反编译:
用 javap 工具反编译一下:
可以看出 Java 字节码在底层也是使用了 goto,所以,终归还是用的 goto ,落叶归根啊!