私はこれについて混乱しています。私たちのほとんどは、Javaにはgotoステートメントがないと言われています。
しかし、Javaのキーワードの1つであることがわかりました。どこで使用できますか?使えないのに、なぜJavaにキーワードとして含まれていたのか?
私はこれについて混乱しています。私たちのほとんどは、Javaにはgotoステートメントがないと言われています。
しかし、Javaのキーワードの1つであることがわかりました。どこで使用できますか?使えないのに、なぜJavaにキーワードとして含まれていたのか?
回答:
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
)に置き換えるか、コードをメソッドに抽出することで置き換えることができるためです。
goto
あるので、何か他のものにそれを強制的にPERFORCEのある、何かを表現するための最もreadybleと明確な方法読みにくく。
キーワードは存在しますが、実装されていません。
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
反映していますが、実装されていないままです(後者の実装については議論があります)。カップルより多くのようにassert
してenum
最初に予約されていなかったが、おそらくされている必要があり、彼らは実装されている与えられました。しかし、後知恵は素晴らしいことです。
それらは将来の使用のために予約されています(Java言語のキーワードを参照)
キーワードconstおよびgotoは、現在使用されていなくても予約されています。
理由はなぜ何のgoto文はJavaではありませんが「で見つけることができますJava言語環境」:
Javaにはgotoステートメントがありません。研究は、gotoが単に「そこにあるから」というよりも(誤って)使用されることを示しています。gotoを削除すると、言語が単純化されます。たとえば、forステートメントの途中にgotoが及ぼす影響についての規則はありません。約100,000行のCコードに関する調査では、ネストされたループから抜け出す効果を得るために、gotoステートメントの約90%が純粋に使用されていることがわかりました。上記のように、マルチレベルのブレークアンドコンティニューにより、gotoステートメントの必要性のほとんどが取り除かれます。
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
プログラマーがマシンコードとアセンブリ言語でプログラミングした時代の構造が残っていることを理解することが重要です。これらの言語は非常に基本的であるため(各命令は1つの処理しか行わないなど)、プログラム制御フローはgoto
ステートメントで完全に実行されます(ただし、アセンブリ言語では、これらはジャンプまたは分岐命令と呼ばれます)。
現在、C言語はかなり低レベルですが、非常に高レベルのアセンブリ言語と考えることができます。Cの各ステートメントと関数は、簡単にアセンブリ言語の命令に分解できます。Cは今日のコンピューターをプログラミングするための主要言語ではありませんが、組み込みシステムなどの低レベルのアプリケーションでは依然として頻繁に使用されています。Cの関数はアセンブリ言語の関数を非常によく反映しているため、Cにgoto
含まれていることだけが理にかなっています。
JavaがC / C ++の進化形であることは明らかです。JavaはCの多くの機能を共有していますが、より多くの詳細を抽象化しているため、単純に異なる方法で書かれています。Javaは非常に高水準の言語であるためgoto
、関数、for、for each、whileループなどのより高水準の構造がプログラム制御フローを行う場合のように、低水準の機能を用意する必要はありません。あなたが1つの関数にいgoto
て、ラベルに対して別の関数にしたと想像してみてください。他の関数が戻るとどうなりますか?この考えはばかげています。
これは必ずしもJavaにgoto
ステートメントが含まれているにもかかわらずコンパイルできない理由に必ずしも答えるものではありませんが、なぜgoto
最初から下位レベルのアプリケーションで使用されたのか、なぜそれが意味をなさないのかを知ることが重要ですJavaで使用されます。
いいえ、goto
使用されませんが、ラベルを定義してループまでラベルを残すことができます。ラベルを使用するbreak
か、continue
続けて使用できます。したがって、複数のループレベルからジャンプすることができます。見ていチュートリアルを。
いいえ、ありがたいことに、goto
Java にはありません。
goto
キーワードは予約済みますが、(同じのために行く使用されませんconst
)。
それはサポートされgoto
ていないので、何もしないキーワードや名前の変数が必要なのはなぜgoto
ですか?
break label;
and 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 ++で使用されているため、おそらく予約されています。意図はおそらく、Javaに移行するC ++プログラマーを混乱させないようにすることと、Javaの今後のリビジョンでそれらを使用するオプションを維持することでした。
goto
近い将来サポートされないことを本当に望んでいます;)
gotoの無害な使用のほとんどを次のように置き換えることができることに注意してください。
帰る
ブレーク
ラベルを破る
try-catch-finallyの中に投げ込む
return
指摘されたように、goto
Java にはありませんが、ある日Sunがgoto
Javaに追加したいと思った場合に備えて、キーワードは予約されていました。彼らは多くのコードを壊すことなくそれを追加できるようにしたかったので、彼らはキーワードを予約しました。Java 5ではenum
キーワードが追加され、それほど多くのコードを壊すことはありませんでした。
Javaは何を持っているがgoto
、それはいくつかの構造を有していないいくつかの用途に対してその対応goto
つまりすることができること、break
およびcontinue
名前付きループを有します。また、finally
一種のねじれたものと考えることもできますgoto
。
同じ名前の変数の宣言を禁止します。
例えば
int i = 0, goto;
http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.goto
Javaにgotoステートメントがないと言われたら、だまされました。実際、Javaは「ソース」コードの2つの層で構成されています。
次のリンクを参照すると、すべての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
でしょう。
もちろんそれはキーワードですが、ソースコードのレベルでは使用されません。
しかし、バイトコードに変換されるjasminまたは他の低レベル言語を使用する場合、「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;
}
}