我很困惑这个问题。 我们大多数人都被告知,没有在Java中任何goto语句。
但是我发现,这是在Java中的关键字之一。 在哪里可以应用? 如果不能使用,那么为什么却包含在Java作为关键字?
我很困惑这个问题。 我们大多数人都被告知,没有在Java中任何goto语句。
但是我发现,这是在Java中的关键字之一。 在哪里可以应用? 如果不能使用,那么为什么却包含在Java作为关键字?
在Java的关键字列表指定goto
关键字,但它被标记为“未使用”。
它是在原来的JVM(参见由@VitaliiFedorenko答案 ),但随后删除。 它可能是保持在一个情况下保留关键字它是被添加到Java的更高版本。
如果goto
不在名单上,它被添加到语言以后,现有所使用的字码goto
作为标识符(变量名,方法名等)将打破。 但由于goto
是一个关键字,这样的代码甚至不会编译本,它仍然可能使它实际上做一些事情以后,不破坏现有的代码。
詹姆斯·高斯林创建了支持原JVM goto
语句,但后来他取消了这一功能是不必要的。 的主要原因goto
是不必要的是,通常它可以与更多可读语句来替换(如break/continue
)或通过提取一段代码到一个方法。
来源: 詹姆斯·高斯林,Q&A环节
关键字存在,但它没有实现。
唯一的好理由使用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;
}
}
http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html
“关键字常量和跳转被保留,即使他们目前没有使用。”
所以,它们可以被用来如果有一天,语言设计者认为有必要。
另外,如果从语言确实具有这些关键字(如C,C ++)的程序员错误地使用他们,那么Java编译器可以给一个有用的错误消息。
或者,也许这只是停止使用转到程序员:)
他们被保留供未来使用(参见: Java语言关键字 )
关键字常量和跳转被保留,即使他们目前尚未使用。
之所以没有在Java中没有goto语句可以在“发现Java语言环境 ”:
Java没有goto语句。 研究说明GOTO指令(MIS)使用更多的,往往不是简单的“因为它的存在”。 消除转到导致语言的简化 - 有没有关于goto语句的影响到的中间为发言规则,例如。 研究大约100,000的C代码行所确定的goto语句的,大约90%是纯粹用于获得爆发嵌套循环的效果。 正如上面提到的,多层次的突破,并继续去除大部分的需要goto语句。
如何使用“继续”标签中的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
当更多的高层次的结构,如功能,对每个和while循环做程序控制流。 试想一下,如果你在一个函数,做了goto
到一个标签到另一个函数。 其他函数返回时,会发生什么? 这种想法是荒谬的。
这并不一定回答为什么Java包含了goto
语句却不会让它编译,但要知道为什么它是重要goto
首先被使用过,在低级别的应用程序,为什么它只是没有任何意义在Java中使用。
不, goto
不使用,但您可以定义标签和退出循环到标签。 您可以使用break
或continue
后面的标签。 所以,你可以跳出一个以上的循环水平。 看看教程 。
没有,谢天谢地,没有goto
Java编写的。
在goto
关键字仅保留,但不能使用(这同样适用const
)。
因为它不支持,为什么你会希望有一个goto
的是什么也没做或命名变量keyword 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");
}
}
不, goto
不是在Java中使用,尽管是一个保留字。 同样是真正的const
。 上述这些问题都在C ++中,这可能是为什么他们保留的理由使用; 意图可能是为了避免混淆C ++程序员迁移到Java,也许还能保持在Java中的后续版本使用它们的选项。
正如指出的那样,没有goto
Java中,但关键字是保留的情况下,孙觉得加入goto
到Java一天。 他们希望能够增加它没有打破太多的代码,所以他们保留的关键字。 需要注意的是使用Java 5他们增加了enum
关键字,并没有任何突破那么多的代码。
虽然Java没有goto
,它有一定的结构,其对应的一些使用goto
,即能够break
并continue
与命名的循环。 另外, finally
可以被看作是一种扭曲的goto
。
请注意,您可以替代大部分转到良性用途
返回
打破
休息标签
扔里面的try-catch-终于
要禁止的变量声明具有相同的名称。
例如int i = 0, goto;
这是非常考虑这些东西你不这样做的,但很可能被列为保留字,以避免开发人员混淆。
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
任一,因为它通常使得码的可读性。 不过我相信,也有例外到规则(尤其是当它涉及到词法分析器和解析器!)
当然,你可以随时将其转换成一些汇编样把你的程序到克莱尼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;
}
}
(所以你基本上是编写一个执行的二进制代码虚拟机...其中line
对应指令指针)
这是这么多比使用代码可读性goto
,是不是?
因为虽然Java语言不使用它,JVM字节码呢。
当然,这是关键字,但是它没有在源代码的水平使用。
但是,如果你使用茉莉或其他更低层次的语言,这是转化为字节码,然后选择“转到”有
后藤不是在Java中
你必须使用GOTO但它不工作所以不能用correctly.in关键的Java字。 http://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html
public static void main(String[] args) {
GOTO me;
//code;
me:
//code;
}
}