java的goto语句_语法 - Java中是否有goto语句?

语法 - Java中是否有goto语句?

我对此感到困惑。 我们大多数人都被告知Java中没有任何goto语句。

但我发现它是Java中的关键词之一。 哪里可以使用? 如果它不能使用,那么为什么它作为关键字包含在Java中呢?

23个解决方案

222 votes

防止人们被迅猛龙杀死。

237ac88a689bfabed3e1edf4f3d32b30.png

Alceu Costa answered 2019-02-28T00:14:45Z

210 votes

James Gosling在支持goto语句的情况下创建了原始JVM,但随后他将此功能删除为不必要的。 goto不必要的主要原因是通常可以用更易读的语句(如break/continue)或通过将一段代码提取到方法中来替换它。

资料来源:James Gosling,Q& A会议

Vitalii Fedorenko answered 2019-02-28T00:15:18Z

178 votes

Java关键字列表指定goto关键字,但标记为“未使用”。

它是在原始的JVM中(见@VitaliiFedorenko的回答),但随后删除了。 它可能保留为保留关键字,以防它被添加到更高版本的Java中。

如果列表中没有goto,并且稍后会将其添加到该语言中,则使用单词goto作为标识符(变量名,方法名等等)的现有代码将会中断。 但是因为goto是一个关键字,这样的代码甚至不会在当前编译,并且仍然可以使它实际上稍后执行某些操作,而不会破坏现有代码。

Thomas answered 2019-02-28T00:14:20Z

137 votes

关键字存在,但未实现。

我能想到的唯一使用goto的理由是:

for (int i = 0; i < MAX_I; i++) {

for (int j = 0; j < MAX_J; j++) {

// do stuff

goto outsideloops; // to break out of both loops

}

}

outsideloops:

在Java中,你可以这样做:

loops:

for (int i = 0; i < MAX_I; i++) {

for (int j = 0; j < MAX_J; j++) {

// do stuff

break loops;

}

}

jonnystoten answered 2019-02-28T00:15:57Z

43 votes

[http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html]

“关键字const和goto是   保留,即使他们不是   目前使用。“

Isaac E answered 2019-02-28T00:16:29Z

28 votes

因此,如果语言设计者感到需要,他们可以在某一天使用。

此外,如果来自具有这些关键字的语言(例如C,C ++)的程序员错误地使用它们,那么Java编译器可以提供有用的错误消息。

或者也许只是为了阻止程序员使用goto :)

dave answered 2019-02-28T00:17:09Z

19 votes

它们保留供将来使用(请参阅:Java语言关键字)

关键字const和goto是保留的,即使它们当前未被使用。

Java中没有goto语句的原因可以在“Java语言环境”中找到:

Java没有goto语句。 研究表明,goto(错误)的使用频率高于“因为它存在”。 消除goto导致语言的简化 - 例如,没有关于goto对for语句中间的影响的规则。 对大约100,000行C代码的研究确定,大约90%的goto语句纯粹用于获得打破嵌套循环的效果。 如上所述,多级中断并继续删除对goto语句的大部分需求。

Heinzi answered 2019-02-28T00:17:57Z

17 votes

如何在Java中使用“continue”标签的示例是:

public class Label {

public static void main(String[] args) {

int temp = 0;

out: // label

for (int i = 0; i < 3; ++i) {

System.out.println("I am here");

for (int j = 0; j < 20; ++j) {

if(temp==0) {

System.out.println("j: " + j);

if (j == 1) {

temp = j;

continue out; // goto label "out"

}

}

}

}

System.out.println("temp = " + temp);

}

}

结果:

I am here // i=0

j: 0

j: 1

I am here // i=1

I am here // i=2

temp = 1

andrew answered 2019-02-28T00:18:24Z

10 votes

重要的是要理解goto构造是程序员用机器代码和汇编语言编程的日子。 因为这些语言是如此基本(例如,每个指令只做一件事),程序控制流程完全用goto语句完成(但在汇编语言中,这些被称为跳转或分支指令)。

现在,虽然C语言相当低级,但它可以被认为是非常高级的汇编语言 - C中的每个语句和函数都可以很容易地分解为汇编语言指令。 尽管C不是当今计算机编程的主要语言,但它仍然在低级应用程序中大量使用,例如嵌入式系统。 因为C的函数如此紧密地反映了汇编语言的功能,所以只有goto包含在C中才有意义。

很明显,Java是C / C ++的演变。 Java与C共享许多功能,但是抽象了更多的细节,因此只是以不同的方式编写。 Java是一种非常高级的语言,因此当更多高级结构(如函数,for,for和while循环)执行程序控制流时,它不需要像goto那样具有低级功能。 想象一下,如果你在一个函数中,并将goto标记到另一个函数中。 当其他函数返回时会发生什么? 这个想法很荒谬。

这并不一定能解释为什么Java包含goto语句但不会让它编译,但重要的是要知道为什么goto首先被用在较低级别的应用程序中,以及为什么它只是没有意义 在Java中使用。

Michael P at NCSU answered 2019-02-28T00:19:13Z

10 votes

不,goto未使用,但您可以定义标签并将循环保留到标签。 您可以使用break或continue,后跟标签。 所以你可以跳出多个循环级别。 看看教程。

Arne Burmeister answered 2019-02-28T00:19:40Z

8 votes

不,谢天谢地,Java中没有goto。

goto关键字仅保留,但未使用(const也是如此)。

Bozho answered 2019-02-28T00:20:14Z

7 votes

因为它不受支持,为什么你想要一个什么都不做的break label;关键字或一个名为continue label;的变量?

虽然您可以使用break label;和continue label;语句来有效地执行goto所做的事情。 但我不推荐它。

public static void main(String [] args) {

boolean t = true;

first: {

second: {

third: {

System.out.println("Before the break");

if (t) {

break second;

}

System.out.println("Not executed");

}

System.out.println("Not executed - end of second block");

}

System.out.println("End of third block");

}

}

pjp answered 2019-02-28T00:20:51Z

6 votes

不,goto在Java中没有使用,尽管它是一个保留字。 对于const也是如此。这两个都在C ++中使用,这可能是它们被保留的原因; 其目的可能是避免让迁移到Java的C ++程序员感到困惑,也许还要保留在Java的后续版本中使用它们的选项。

Michael Borgwardt answered 2019-02-28T00:21:19Z

2 votes

正如所指出的那样,Java中没有goto,但关键字是保留的,以防Sun感觉有一天会向Java添加goto。 他们希望能够在不破坏太多代码的情况下添加它,因此他们保留了关键字。 请注意,在Java 5中,他们添加了goto关键字,并且它也没有破坏那么多代码。

虽然Java没有goto,但它有一些构造对应于goto的一些用法,即能够break和continue具有命名循环。 另外,finally可以被认为是一种扭曲的goto。

Thomas Pornin answered 2019-02-28T00:21:59Z

1 votes

禁止声明具有相同名称的变量。

例如int i = 0, goto;

Karl answered 2019-02-28T00:22:36Z

1 votes

它被认为是你不做的事情之一,但可能被列为保留字,以避免混淆开发人员。

Dean J answered 2019-02-28T00:23:07Z

1 votes

[http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.goto]

如果你被告知Java中没有goto语句你就被愚弄了。 实际上,Java包含两层“源”代码。

Mikael Lindlöf answered 2019-02-28T00:23:44Z

1 votes

请注意,您可以替换goto的大部分良性用法

返回

打破

打破标签

扔进了try-catch-finally

starblue answered 2019-02-28T00:24:36Z

1 votes

请参阅以下链接,显示所有java保留字,并告诉您它们添加的版本。

[http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html]

goto是保留的,即使它当前没有使用,也绝不会说永远不会:)

Paul Whelan answered 2019-02-28T00:25:21Z

1 votes

我也不是goto的粉丝,因为它通常会使代码的可读性降低。 但是我确实相信该规则有例外(特别是当词法分析器和解析器时!)

当然,您可以将程序转换为类似汇编程序的程序,然后编写类似的东西,将程序带入Kleene Normalform

int line = 1;

boolean running = true;

while(running)

{

switch(line++)

{

case 1: /* line 1 */

break;

case 2: /* line 2 */

break;

...

case 42: line = 1337; // goto 1337

break;

...

default: running = false;

break;

}

}

(所以你基本上写一个执行你的二进制代码的VM ...其中goto对应于指令指针)

这比使用goto的代码更具可读性,不是吗?

Viktor Engelmann answered 2019-02-28T00:26:12Z

0 votes

因为虽然Java语言不使用它,但JVM字节码可以。

gribnit answered 2019-02-28T00:26:43Z

0 votes

当然它是关键字,但它不用于源代码级别。

但是如果你使用jasmin或其他低级语言,它转换为字节码,那么“goto”就在那里

user1722245 answered 2019-02-28T00:27:21Z

-3 votes

goto不是Java

你必须使用GOTO但它无法正常工作。在关键的java字中它没有被使用。[http://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html]

public static void main(String[] args) {

GOTO me;

//code;

me:

//code;

}

}

m-tech answered 2019-02-28T00:27:58Z

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值