私はこれについて混乱しています。私たちのほとんどは、Java には goto ステートメントがないと言われています。
しかし、Java のキーワードの 1 つであることを発見しました。どこで使用できますか?使用できない場合、なぜJavaにキーワードとして含まれていたのですか?
James Gosling は、ステートメントをサポートする元の JVM を作成しましたgoto
が、その後、この機能を不要として削除しました。不要である主な理由goto
は、通常、より読みやすいステートメント ( などbreak/continue
) に置き換えるか、コードの一部をメソッドに抽出することで置き換えることができるためです。
Java キーワード リストでキーワードが指定されていますgoto
が、「未使用」とマークされています。
元の JVM ( @VitaliiFedorenko による回答を参照) にありましたが、その後削除されました。Java の新しいバージョンに追加される場合に備えて、予約済みのキーワードとして保持されていた可能性があります。
goto
リストになく、後で言語に追加された場合、その単語を識別子 (変数名、メソッド名など) として使用していた既存のコードは機能しなくなりますgoto
。しかし、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;
}
}
http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html
"キーワード const と goto は予約されていますが、現在は使用されていません。"
したがって、言語設計者が必要性を感じた場合、それらはいつの日か使用される可能性があります。
また、これらのキーワードを持つ言語 (C、C++ など) のプログラマーがこれらのキーワードを誤って使用した場合、Java コンパイラーは有用なエラー メッセージを表示できます。
あるいは、プログラマーが goto を使用するのを止めるためだったのかもしれません :)
これらは将来の使用のために予約されています (参照: Java 言語キーワード)
キーワード const と goto は予約されていますが、現在は使用されていません。
Java に goto ステートメントがない理由は、「The Java Language Environment」にあります。
Java には goto 文がありません。調査によると、goto は単に「そこにあるから」というよりも頻繁に (誤) 使用されています。goto を削除すると、言語が単純化されました。たとえば、for ステートメントの途中での 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
この構造は、プログラマーがマシン コードやアセンブリ言語でプログラミングした時代の名残であることを理解することが重要です。これらの言語は非常に基本的であるため (各命令は1 つのことしか実行しないため)、プログラム制御フローは完全にgoto
ステートメントで行われます (ただし、アセンブリ言語では、これらはジャンプまたは分岐命令と呼ばれます)。
現在、C 言語はかなり低レベルですが、非常に高レベルのアセンブリ言語と考えることができます。C の各ステートメントと関数は、アセンブリ言語の命令に簡単に分解できます。C は現在、コンピューターをプログラムするための主要な言語ではありませんが、組み込みシステムなどの低レベルのアプリケーションでは依然として頻繁に使用されています。goto
C の機能はアセンブリ言語の機能を非常によく反映しているため、Cに含まれていることだけが理にかなっています。
Java が C/C++ の進化形であることは明らかです。Java は C と多くの機能を共有していますが、より多くの詳細を抽象化しているため、単に別の方法で記述されています。Java は非常に高水準の言語であるためgoto
、関数、for、for each、while ループなどのより高水準の構造体がプログラム制御フローを実行する場合のように、低水準の機能を持つ必要はまったくありません。goto
ある関数にいて、別の関数にラベルを付けたと想像してください。他の関数が戻るとどうなるでしょうか? この考えはばかげています。
goto
これは、Java がステートメントをインクルードしているにもかかわらずコンパイルを許可しない理由を必ずしも答えているわけではありませんが、なぜgoto
最初に低レベルのアプリケーションで使用されたのか、なぜそれが意味をなさないのかを知ることは重要です。 Java で使用されます。
いいえ、goto
使用されませんが、ラベルを定義して、ラベルまでループを残すことができます。break
またはcontinue
の後にラベルを使用できます。そのため、複数のループ レベルから飛び出すことができます。チュートリアルをご覧ください。
サポートされていないため、goto
何もしないキーワードや という名前の変数が必要なのはなぜgoto
ですか?
break label;
andcontinue 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 にはありません。
goto
キーワードは予約されているだけで、使用されていません (同じことが にも当てはまります) const
。
いいえ、goto
予約語ですが、Java では使用されません。についても同様ですconst
。これらはどちらも C++ で使用されているため、おそらく予約されています。その意図は、Java に移行する C++ プログラマーを混乱させないようにすることと、Java の後のリビジョンでそれらを使用するオプションを維持することでした。
gotoの良性の使用のほとんどを次のように置き換えることができることに注意してください
戻る
壊す
ラベルを破る
try-catch-finallyの中に投げる
指摘されたように、Java にはありませんが、Sun がいつか Javagoto
に追加したいと感じた場合に備えて、キーワードは予約されていました。goto
彼らはコードをあまり壊さずに追加できるようにしたかったので、キーワードを予約しました。enum
Java 5 ではキーワードが追加され、それほど多くのコードが壊れていないことに注意してください。
Java には がありませんがgoto
、 のいくつかの使用法に対応するいくつかの構成体がgoto
ありbreak
ますcontinue
。また、finally
一種のねじれた と考えることができますgoto
。
これは、あなたがしてはいけないことの1つと非常に考えられていますが、開発者の混乱を避けるために、おそらく予約語としてリストされています。
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 は予約されていますが、現在は使用されていませんが、絶対に使用しないでください :)
はい、可能ですが、C# ほど良くはありません (私の意見では、C# の方が優れています!)。goto が常にソフトウェアを曖昧にするという意見は、退屈でばかげています。悲しいことに、Java には少なくとも goto ケース xxx がありません。
次へジャンプ:
public static void main(String [] args) {
myblock: {
System.out.println("Hello");
if (some_condition)
break myblock;
System.out.println("Nice day");
}
// here code continue after performing break myblock
System.out.println("And work");
}
後方にジャンプ:
public static void main(String [] args) {
mystart: //here code continue after performing continue mystart
do {
System.out.println("Hello");
if (some_condition)
continue mystart;
System.out.println("Nice day");
} while (false);
System.out.println("And work");
}
同名変数の宣言を禁止する。
例えば
int i = 0, goto;
goto
通常、コードが読みにくくなるため、私はどちらも好きではありません。ただし、その規則には例外があると思います (特にレクサーとパーサーに関しては!)
もちろん、プログラムをアセンブラーのようなものに変換してから、
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」があります。
Java 言語では使用されませんが、JVM バイトコードでは使用されるためです。