나는 이것에 대해 혼란스러워한다. 우리 대부분은 Java에 goto 문이 없다고 들었습니다.
그러나 나는 그것이 Java의 키워드 중 하나라는 것을 알았습니다. 어디에서 사용할 수 있습니까? 사용할 수 없다면 왜 키워드로 Java에 포함 되었습니까?
나는 이것에 대해 혼란스러워한다. 우리 대부분은 Java에 goto 문이 없다고 들었습니다.
그러나 나는 그것이 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
것입니다 무엇으로 강제하는 것은 억지로 그래서 무언가를 표현하는 가장 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는 현재 사용되지 않더라도 예약되어 있습니다.
그 이유 왜 자바에는 고토 문 "에서 발견 할 수있다 Java 언어 환경 "
Java에는 goto 문이 없습니다. 연구에 따르면 goto는 단순히 "있는 이유"가 아니라 자주 사용됩니다. goto를 제거하면 언어가 단순화되었습니다. 예를 들어 for 문 중간에 goto의 영향에 대한 규칙은 없습니다. 약 10 만 줄의 C 코드에 대한 연구에 따르면 대략 90 %의 goto 문의가 순전히 중첩 루프에서 벗어날 수있는 효과를 얻는 데 사용 된 것으로 나타났습니다. 위에서 언급했듯이, 다단계 나누기와 계속해서 goto 문의 필요성을 대부분 제거합니다.
goto
예약되어 있지만 나중에 사용할 수 없습니다.
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
goto
프로그래머가 기계 코드 및 어셈블리 언어로 프로그래밍 한 시절부터 구성이 남아 있다는 것을 이해하는 것이 중요합니다 . 이러한 언어는 매우 기본적이므로 (각 명령어는 한 가지 작업 만 수행함) 프로그램 제어 흐름은 goto
명령문으로 완전히 수행됩니다 (하지만 어셈블리 언어에서는 점프 또는 분기 명령어 라고 함 ).
이제 C 언어는 상당히 저수준이지만 매우 높은 수준의 어셈블리 언어로 생각할 수 있습니다. C의 각 문과 함수는 어셈블리 언어 명령어로 쉽게 나눌 수 있습니다. C는 오늘날 컴퓨터를 프로그래밍하는 주요 언어는 아니지만 임베디드 시스템과 같은 저수준 응용 프로그램에서 여전히 많이 사용됩니다. C의 함수는 어셈블리 언어의 함수와 매우 유사하기 때문에goto
에 포함 된 가 있습니다.
Java가 C / C ++의 진화라는 것은 분명합니다. Java는 C의 많은 기능을 공유하지만 더 많은 세부 사항을 추상화하므로 단순히 다르게 작성됩니다. Java는 매우 높은 수준의 언어이므로 goto
함수, 각, for 및 while 루프와 같은 더 높은 수준의 구문이 프로그램 제어 흐름을 수행하는 경우 와 같은 낮은 수준의 기능을 가질 필요는 없습니다 . 하나의 기능에 있었고goto
다른 기능에 레이블을 지정 . 다른 함수가 반환되면 어떻게됩니까? 이 아이디어는 터무니 없다.
이것은 왜 자바가 goto
문장을 포함하는지 아직 대답하지는 않지만 컴파일하지 못하게하지만, 왜 goto
처음에는 저수준 응용 프로그램에서 사용되었으며 왜 그것이 합리적이지 않은지를 아는 것이 중요 합니다 자바에서 사용됩니다.
아니요, 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
예약어 임에도 불구하고, 자바에서 사용되지 않습니다. 의 경우도 마찬가지입니다 const
. 둘 다 C ++에서 사용되는데, 이것이 예약 된 이유 일 것입니다. 의도는 아마도 C ++ 프로그래머가 Java로 마이그레이션하는 것을 혼동하지 말고 나중에 Java 개정판에서 사용하는 옵션을 유지하는 것이 었습니다.
goto
가까운 장래에 최소한 지원되지 않기를 정말로 바란다 .)
goto의 모든 양성 사용을 다음과 같이 대체 할 수 있습니다.
반환
단절
브레이크 라벨
try-catch-finally 안으로 던져
return
지적한 바와 같이, goto
Java 에는 존재하지 않지만 Sun이 goto
Java에 하루를 추가 하는 것 같은 느낌이들 경우 키워드가 예약되어 있습니다. 너무 많은 코드를 중단하지 않고 추가 할 수 있기를 원했기 때문에 키워드를 예약했습니다. Java 5에서는enum
키워드 했지만 많은 코드를 깨뜨리지 않았습니다.
Java에는에는 없지만 goto
, 일부 사용 goto
, 즉 명명 된 루프 break
와 continue
함께 사용할 수 있는 일부 구문이 있습니다. 또한 finally
일종의 뒤틀린 것으로 생각할 수 있습니다 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는 현재 사용되지 않더라도 예약되지 않습니다.
나는 팬이 아니야 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"가 있습니다.
고토 에 없습니다 Java
GOTO 를 사용해야 하지만 올바르게 작동하지 않습니다. 핵심 Java 단어에서는 사용되지 않습니다. http://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html
public static void main(String[] args) {
GOTO me;
//code;
me:
//code;
}
}