我对此感到困惑。我们大多数人都被告知Java中没有任何goto语句。
但是我发现它是Java中的关键字之一。在哪里可以使用?如果不能使用它,为什么将它作为关键字包含在Java中?
我对此感到困惑。我们大多数人都被告知Java中没有任何goto语句。
但是我发现它是Java中的关键字之一。在哪里可以使用?如果不能使用它,为什么将它作为关键字包含在Java中?
Answers:
在Java的关键字列表指定的goto
关键字,但它被标记为“未使用”。
它在原始JVM中(请参阅@VitaliiFedorenko的答案),但随后将其删除。如果将其添加到Java的更高版本中,则可能将其保留为保留关键字。
如果goto
不在列表中,并且稍后将其添加到语言中,则使用该单词goto
作为标识符(变量名,方法名等)的现有代码将中断。但是因为goto
是关键字,所以这样的代码目前甚至无法编译,并且仍有可能使其稍后在不破坏现有代码的情况下实际执行某些操作。
This was probably done in case it were to be added to a later version of Java.
实际上,主要原因是有点不同(请参阅下面的答案)
James Gosling创建了带有goto
语句支持的原始JVM ,但随后他将该功能移除为不必要。goto
不必要的主要原因是通常可以将其替换为更具可读性的语句(如break/continue
)或将一段代码提取到方法中。
资料来源:James Gosling,问答环节
goto
是最容易和最清楚的方式来表达事物,因此将其强制放入其他任何事物中的行为都会使可读性降低。
关键字存在,但未实现。
我能想到的使用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;
}
}
break loops
意味着“打破循环称为loops
”。也许回想起来,这个标签可能更合适outer
。
while (true) {
... }
是过大的。GOTO经常因使用不当而受到污名化,但我认为,对布尔文字进行不必要的比较会比GOTO糟糕。
continue LABEL;
语句结合使用也非常有用。因此,您可以继续进行外循环。
http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html
“关键字const和goto被保留,即使它们当前未被使用。”
因此,如果语言设计人员认为有必要,可以在一天之内使用它们。
同样,如果使用具有这些关键字(例如C,C ++)的语言的程序员错误地使用了它们,则Java编译器会给出有用的错误消息。
或者也许只是为了阻止程序员使用goto :)
goto
并const
反映了其C / C ++的传统,但它们仍未实现(尽管关于实现后者的争论一直存在)。有几个更像assert
并且enum
最初并没有保留,但是考虑到已经实现,应该保留一些。但是事后看来是一件了不起的事情。
如何在Java中使用“继续”标签的示例是:
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
重要的是要了解,goto
从程序员使用机器代码和汇编语言进行编程以来,该构造就已经存在。由于这些语言非常基础(例如,每条指令仅做一件事),因此程序控制流完全由goto
语句完成(但在汇编语言中,这些称为跳转或分支指令)。
现在,尽管C语言是相当底层的,但可以将其视为非常高级的汇编语言-C中的每个语句和函数都可以轻松地分解为汇编语言指令。尽管C并不是当今编程计算机的主要语言,但它仍大量用于底层应用程序(例如嵌入式系统)中。因为C的功能如此紧密地反映了汇编语言的功能,所以只有goto
包含在C中。
显然,Java是C / C ++的发展。Java具有C语言的许多功能,但是抽象了很多细节,因此编写方式有所不同。Java是一种非常高级的语言,因此根本没有必要具有低级功能,例如,goto
当诸如函数,for,for和while循环执行程序控制流时,就需要具有更高级的构造。想象一下,如果您处于一个功能中,并且goto
将一个标签标记为另一个功能。当另一个函数返回时会发生什么?这个想法是荒谬的。
这并不一定能回答为什么Java包含该goto
语句但仍不允许其编译的问题,但重要的是要知道为什么goto
首先在较低级别的应用程序中使用过该语句,以及为什么这样做根本没有意义。在Java中使用。
不,goto
不使用,但是您可以定义标签,并在标签之前循环。您可以使用break
或continue
后跟标签。因此,您可以跳出多个循环级别。看一下教程。
不,值得庆幸的是goto
,Java中没有。
该goto
关键字仅保留,但不使用(也是如此const
)。
因为不支持它,为什么要一个goto
什么都不做的关键字或一个名为goto
?
尽管可以使用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");
}
}
The keywords const and goto are reserved, even though they are not currently used. This may allow a Java compiler to produce better error messages if these C++ keywords incorrectly appear in programs.
这意味着“我们不使用它,因此,如果您来自C ++背景,我们将完全不让您使用它。” 2)goto
是一个糟糕的方法名称。抱歉。3)建议中断并继续,但不要以此处使用的方式。4)“最有可能” [需要引用]。
不,goto
尽管是保留字,但在Java中未使用。的情况也是如此const
。这两个都是在C ++中使用的,这可能是保留它们的原因。这样做的目的可能是避免使C ++程序员迁移到Java时造成混淆,并且还可能保留在更高版本的Java中使用它们的选择。
goto
至少在不久的将来不会得到支持;)
请注意,您可以通过以下方式替换goto的大部分良性用途:
返回
打破
打破标签
最终放入try-catch-find
return
http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.goto
如果您被告知Java中没有goto语句,那么您就被愚弄了。实际上,Java包含两层“源”代码。
请参阅以下链接,其中显示了所有Java保留字,并告诉您它们添加了哪些版本。
http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html
goto是保留的,即使它当前未被使用,也不要说从不:)
我不喜欢 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 ... line
对应于指令指针)
这比使用的代码更具可读性goto
,不是吗?
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;
}
}