Я запутался в этом. Большинству из нас сказали, что в Java нет операторов goto.
Но я обнаружил, что это одно из ключевых слов в Java. Где это можно использовать? Если его нельзя использовать, то почему он был включен в 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.
На самом деле главная причина немного другая (см. Мой ответ ниже)Джеймс Гослинг создал оригинальную JVM с поддержкой
goto
утверждений, но затем он удалил эту функцию как ненужную. Основная причинаgoto
в том, что она не нужна, состоит в том, что обычно ее можно заменить более читаемыми выражениями (напримерbreak/continue
) или путем извлечения части кода в метод.Источник: Джеймс Гослинг, сессия вопросов и ответов
источник
goto
- самый готовый и понятный способ выразить что-то, поэтому принуждение к чему-либо еще менее читабельно .Ключевое слово существует, но оно не реализовано.
Единственная веская причина использовать goto, о которой я могу думать, это:
В Java вы можете сделать это следующим образом:
источник
break loops
означает «вырваться из цикла называетсяloops
». Возможно, оглядываясь назад, можно было бы найти лучшее название для лейблаouter
.while (true) {
...}
это излишне. GOTO часто подвергается стигматизации за неправильное использование, но я утверждаю, что ненужные сравнения с логическими литералами хуже, чем GOTO.continue LABEL;
утверждением. Таким образом, вы можете продолжить внешнюю петлю лжи.http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html
источник
Таким образом, их можно было бы использовать однажды, если бы дизайнеры языка почувствовали необходимость.
Кроме того, если программисты из языков, которые имеют эти ключевые слова (например, C, C ++), используют их по ошибке, то компилятор Java может выдать полезное сообщение об ошибке.
Или, может быть, это было просто, чтобы остановить программистов, использующих goto :)
источник
goto
иconst
отражает ее наследие C / C ++, но они остаются нереализованными (хотя были споры о реализации последнего). Пара больше понравиласьassert
иenum
изначально не была зарезервирована, но, возможно, следовало бы, учитывая, что они были реализованы. Но задним числом это замечательная вещь.Они зарезервированы для будущего использования (см .: Ключевые слова языка Java )
Причину, по которой в Java нет оператора goto, можно найти в разделе «Языковая среда Java »:
источник
goto
Зарезервировано, но не для будущего использования.Пример использования меток «продолжить» в Java:
Полученные результаты:
источник
Важно понимать, что
goto
конструкция является остатком тех дней, когда программисты программировали на машинном коде и ассемблере. Поскольку эти языки настолько просты (как, например, каждая инструкция выполняет только одно ), процесс управления программой полностью выполняется с помощьюgoto
операторов (но на языке ассемблера они называются инструкциями перехода или перехода ).Теперь, хотя язык C довольно низкоуровневый, его можно рассматривать как язык ассемблера очень высокого уровня - каждое утверждение и функция в C могут быть легко разбиты на инструкции на языке ассемблера. Хотя C сегодня не является основным языком программирования компьютеров, он все еще широко используется в приложениях низкого уровня, таких как встроенные системы. Поскольку функция C настолько близко отражает функцию ассемблера, имеет смысл только то, что
goto
включено в C.Понятно, что Java - это эволюция C / C ++. Java имеет много функций из C, но абстрагирует намного больше деталей, и поэтому просто написано по-другому. Java - это язык очень высокого уровня, поэтому просто нет необходимости иметь низкоуровневые функции, например,
goto
когда более высокоуровневые конструкции, такие как функции, для каждого, и в то время как циклы выполняют поток управления программой. Представьте, что вы были в одной функции и сделалиgoto
метку для другой функции. Что произойдет, когда другая функция вернется? Эта идея абсурдна.Это не обязательно объясняет, почему Java включает
goto
оператор, но не позволяет его компилировать, но важно знать, почему оноgoto
вообще использовалось, в приложениях более низкого уровня, и почему просто не имеет смысла используется в Java.источник
Нет,
goto
не используется, но вы можете определить метки и оставить цикл до метки. Вы можете использоватьbreak
илиcontinue
следовать метки. Таким образом, вы можете выпрыгнуть более чем на один уровень цикла. Взгляните на учебник .источник
Нет, к счастью, нет
goto
в Java.goto
Ключевое слово только зарезервирован, но не используется (то же самое касаетсяconst
).источник
Потому что это не поддерживается и зачем вам
goto
ключевое слово, которое ничего не делало, или переменная с именемgoto
?Хотя вы можете использовать
break label;
иcontinue label;
заявления, чтобы эффективно делать то, чтоgoto
делает. Но я бы не рекомендовал это.источник
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 на
возвращение
перерыв
сломать ярлык
бросить внутрь попробовать-поймать-наконец
источник
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 состоит из двух уровней «исходного» кода.
источник
Смотрите следующую ссылку, показывает все зарезервированные слова Java и говорит вам, какие версии они были добавлены.
http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html
goto зарезервировано, хотя в настоящее время оно не используется, однако никогда не говорите никогда :)
источник
Я не фанат
goto
ни того, ни другого, поскольку это обычно делает код менее читабельным. Однако я верю, что есть исключения из этого правила (особенно когда речь идет о лексерах и парсерах!)Конечно, вы всегда можете перенести свою программу в Kleene Normalform, переведя ее в нечто, похожее на ассемблер, а затем написать что-то вроде
(Таким образом, вы в основном пишете виртуальную машину, которая выполняет ваш двоичный код ... где
line
соответствует указателю инструкции)Это гораздо более читабельно, чем код, который использует
goto
, не так ли?источник
Конечно, это ключевое слово, но оно не используется на уровне исходного кода.
Но если вы используете jasmin или другой язык более низкого уровня, который преобразуется в байт-код, тогда "goto" есть
источник
Потому что, хотя язык Java не использует его, байт-код JVM делает это.
источник
load
ключевого слова?Гото не в Яве
Вы должны использовать GOTO, но он не работает правильно. В ключевом Java-слове он не используется. http://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html
источник