Есть ли в Java оператор goto?

Я написал программу на C ++ с некоторыми операторами goto. Теперь мне нужно написать ту же программу на Java. Есть ли в Java опция goto? Если да, то как это можно реализовать? Он такой же, как C ++?

Моя программа:

#include<stdio.h>
#include<conio.h>

void main()
{
    int i,j,k,w,l,q,d;
    clrscr();
    printf("\nEnter the limit:");
    scanf("%d",&k);
    for(i = 13; i <= k ; i++)
    {
        repeat:
        j = i%10;
        if (j != 0)
        {
            if(i < 99)
            {
                for(w = 1; w <= 9; w++)
                {
                    l = 11*w;
                    if (l == i){
                        i++;
                        goto repeat;
                    }
                }
            }
            if(i > 99)
            {
                for(q = 1; q<=9 ; q++)
                {
                    d = 111*q;
                    if (d == i){
                        i++;
                        goto repeat;
                    }
                }
            }
            printf("%d,",i);
        }
    }
    getch();
}

person Pari Sairam Mohan    schedule 08.07.2011    source источник
comment
Я не думаю, что вам нужно было включать пример кода в этот вопрос; все знают, что такое goto.   -  person David Grayson    schedule 08.07.2011
comment
Обратите внимание, что использование goto считается очень плохой практикой. Кроме того, main() должен возвращать int, а не void.   -  person BЈовић    schedule 08.07.2011
comment
Если вы используете Java и хотите добавить goto, использовать множественное наследование или еще несколько вещей, это означает только одно: вы неправильно думаете и неправильно принимаете проблему. И в любом случае, каким бы языком ни был, goto - плохой способ делать что-то, он может вызвать ужасные ошибки, которые могут привести к полупетлям и другим очень неприятным сюрпризам.   -  person SteeveDroz    schedule 08.07.2011
comment
Вы могли бы сделать некоторый рефакторинг. Понятия не имею, что делает эта программа.   -  person Thorbjørn Ravn Andersen    schedule 08.07.2011
comment
@VJo: Несмотря на то, что значение, возвращаемое main(), имеет значение, для main() не обязательно возвращать int. Когда программа автономна и тип возвращаемого значения не имеет значения, можно использовать тип возвращаемого значения void ... Пожалуйста, поправьте меня, если я ошибаюсь!   -  person Mahendra Liya    schedule 08.07.2011
comment
@mahi: main () обязательно должен возвращать int. Один конкретный компилятор, пришедший из Редмонда, штат Вашингтон, допускает эту нестандартную void main() ерунду. Это ерунда.   -  person David Hammen    schedule 08.07.2011
comment
Во многих смыслах это не программа на C ++.   -  person Karl Knechtel    schedule 08.07.2011
comment
@mahl Вы были бы удивлены, если бы у вас был доступ к стандарту C ++. Прочтите, например, этот вопрос: stackoverflow.com/ questions / 204476 /   -  person BЈовић    schedule 08.07.2011
comment
@VJo и @David: спасибо, что поправили меня ... :-)   -  person Mahendra Liya    schedule 08.07.2011
comment
@Pari, у тебя начинается с 13. Когда лимит тоже совпадает, напечатает число после лимита. например если предел равен 22, будет напечатано 23. Это примет каждое значение больше 999, которое не кратно десяти. Это поведение задумано?   -  person Peter Lawrey    schedule 08.07.2011
comment
Похоже, у этого человека такая же домашняя работа stackoverflow.com/questions/6620295/   -  person Peter Lawrey    schedule 08.07.2011


Ответы (7)


Нет, в Java нет оператора goto по замыслу. Считается вредным.

Ваш код может быть переписан с continue repeat вместо goto repeat, если метка repeat: была размещена непосредственно перед циклом for.

E.g.

repeat: for(i=13;i<=k;i++)

а потом

continue repeat;

вместо goto repeat

person Theo    schedule 08.07.2011
comment
Нет ничего лучше continue repeat; Это просто continue. - person iammilind; 08.07.2011
comment
Почему goto считается вредным: david.tribble.com/text/goto.html - person Tobias Langner; 08.07.2011
comment
@iammilind, да, есть. Это позволяет continue дальше, чем самый внутренний цикл. java2s.com/Tutorial/Java/0080__Statement-Control/ - person Thorbjørn Ravn Andersen; 08.07.2011
comment
@iammilind, позволю себе не согласиться. download.oracle.com/javase/tutorial/java/nutsandbolts/ ищите продолжить тест. - person Theo; 08.07.2011
comment
@Theo, вы написали, Your code could be rewritten with continue repeat; Я рассматривал это в контексте C ++. Хорошо, я заберу свой голос против. - person iammilind; 08.07.2011
comment
То, что C и C ++ не имеют возможности прервать / продолжить работу из многократно вложенного цикла, является одним из все еще одобряемых вариантов использования goto в C / C ++. В Java есть такая конструкция; нет необходимости в этом частном использовании goto, которое все еще оправдывается, в C и C ++. - person David Hammen; 08.07.2011
comment
Я пробовал использовать continue. Но это дает ошибку, а не метку цикла: myLable. Продолжение работает только для петель? - person Sachin Mhetre; 17.04.2012
comment
Да, это не общая goto функция. Надо поставить метку перед циклом, например repeat: for (...) - person Theo; 17.04.2012

Нет Java не имеет goto в active < / strong> состояние (но в состоянии зарезервировано). Вы не можете использовать его в своей программе сейчас (это зарезервированное ключевое слово).

И избегайте его использования и в C ++. Вы можете написать свою программу, используя грамотно размещенные continue и / или break для обоих языков.

person iammilind    schedule 08.07.2011
comment
Не в этом дело. В Java есть конструкция gotoless, которая позволяет автору выполнять то, что он хочет, но не в C / C ++. Единственный выбор - это неуклюжие флаги, которые многие считают хуже, чем goto, или хорошо ограниченные goto, которые многие считают лучше, чем эти неуклюжие флаги. - person David Hammen; 08.07.2011
comment
@ Дэвид, здесь дело обстоит не так. Цель gotos - просто прервать текущую итерацию цикла, чтобы оператор printf в конце не был достигнут. Это естественно переводится как continue. Если, конечно, OP не намеревается выполнить еще одну итерацию цикла в случае, если k когда-либо равно l или _5 _... - person Karl Knechtel; 08.07.2011
comment
Так обстоит дело здесь, и я также имел в виду общий случай. Общий случай - выйти из или продолжить некоторый внешний цикл. Именно так OP здесь использует goto. Это можно реализовать непосредственно в Java, заменив операторы goto операторами продолжения Java (которые, возможно, принимают метку в качестве аргумента). C / C ++ break и continue не принимают аргументов; они применяются только к самому внутреннему циклу. - person David Hammen; 08.07.2011
comment
В чем разница между goto и continue или break (кроме в конце case)? Все они нарушают логический поток программы и затрудняют рассуждение о таких вещах, как инварианты цикла и тому подобное. (Конечно, если функция достаточно велика для того, чтобы иметь существенное значение, она слишком велика. Что можно также сформулировать так: если функция достаточно велика, чтобы у вас возникло соблазн использовать любую из них, она слишком велика. большой.) - person James Kanze; 08.07.2011

Короткий ответ: нет.

Вы также можете обратиться к этому вопросу

person chedine    schedule 08.07.2011
comment
В Java есть goto ключевое слово. - person iammilind; 08.07.2011
comment
да, но не используется. Просто зарезервированное ключевое слово. - person chedine; 08.07.2011
comment
const - еще одно зарезервированное ключевое слово. - person Peter Lawrey; 08.07.2011

Хотя goto - зарезервированное слово в Java, оно не используется в языке Java. Но есть метка, идентификатор, который можно использовать вместе с break или continue. Назначение метки - позволить итерации выйти за пределы итерации, это немного похоже на инструкцию goto.

Код:

labelA:
// some loop {
    continue labelA;
}
person Rupok    schedule 08.07.2011
comment
У вас почти 1000 репутации, но до сих пор вы не знаете, как редактировать свой пост и кодифицировать свой код. : S - person Buhake Sindi; 08.07.2011

Я написал программу на C ++ с некоторыми операторами goto.

Нет, это не так. C ++ требует, чтобы main() возвращал int, а <stdio.h> - это библиотека C (и conio.h библиотека C для конкретной платформы). В C ++ мы пишем это <cstdio> и обычно не используем его (потому что <iostream> гораздо более мощный и типобезопасный). Однако ваша программа действительна C.

Теперь мне нужно написать ту же программу на java.

Боже мой, почему? Насколько я могу понять, для чего на самом деле предназначена ваша программа, в ней нет ничего полезного. Если это домашнее задание, ваш учитель невероятно плохо объясняет хороший стиль программирования, насколько я могу судить.

Есть ли в Java опция goto?

Нет, goto не реализован в Java. Они сделали это, потому что у вас нет причин использовать это. Нет, правда. Тот факт, что все работает в ядре Linux, не означает, что у вас есть причина. (Это также не значит, что у них есть настоящая причина.)

Программу можно написать проще, например:

#include<stdio.h>  
#include<conio.h>  
void main()  
{  
    int i,j,k,w,l,q,d;  
    clrscr();  
    printf("\nEnter the limit:");  
    scanf("%d",&k);  
    for(i=13;i<=k;i++)  
    {   
        j=i%10;  
        if (j == 0) continue;
        if (i<99)  
        {  
            for(w=1;w<=9;w++)  
            {  
                l=11*w;  
                if (l==i) continue;
            }  
        } 
        else
        {  
            for(q=1;q<=9;q++)  
            {  
                d=111*q;  
                if(d==i) continue; 
            }  
        }  
        printf("%d,",i);  
    }  
    getch();  
}

И такой же базовый подход будет работать и в Java.

Хотя действительно нужно поработать над еще несколькими вопросами стиля. Пожалуйста, попробуйте использовать настоящие имена переменных и ограничьте область видимости переменных.

person Karl Knechtel    schedule 08.07.2011
comment
Это не то же самое, что программа OP. Программа OP не печатает числа, кратные 10, 2-значные числа, кратные 11, и 3-значные числа, кратные 111. - person David Hammen; 08.07.2011
comment
А, я вижу, continues в настоящее время находятся во внутренних циклах for. Безразлично ко мне. Наверное, из-за того, что я обычно не пишу такой бесполезной ерунды :) - person Karl Knechtel; 09.07.2011

Иногда я одобряю использование goto. Это не один из тех случаев. Эта конкретная проблема может быть решена без какого-либо goto (break и continue - это goto, просто ограниченная форма).

#include <iostream>

int main()
{
    unsigned int lim;
    std::cout << "Enter the limit: ";
    std::cin >> lim;
    std::cout << "\n";

    if (lim > 999) {
        std::cout << lim << " is too large. Truncating to 999.\n";
        lim = 999;
    }

    // Why start at 13? Oh well.
    for (unsigned int ii=13; ii <= lim; ii++) {
        if (((ii % 10) != 0) &&
            ((ii < 100) ? (ii % 11) != 0 : (ii % 111 != 0))) {
            std::cout << ii << ",";
        }
    }
    std::cout << "\n";
    return 0;
}

Бывают случаи, когда самый простой способ написать кусок кода - это прерывание или продолжение. Бывают случаи, когда самый простой способ написать кусок кода - это многоуровневый перерыв или продолжение. Хотя Java действительно предоставляет такой механизм, ни C, ни C ++ не предоставляют.

Как я уже сказал вначале, иногда я одобряю использование goto. Случаи очень и очень редки:

  • Имитировать многоуровневый перерыв или продолжить, когда это действительно самый ясный способ написать код.
  • Чтобы иметь дело с ошибками в глупой среде программирования, которая требует единой точки входа, единой точки возврата.
  • Для работы с ошибками в среде программирования, которая заставляет пытаться, ловить и бросать запрещенные ключевые слова.
  • Для реализации конечного автомата (но в этом случае цикл вокруг переключателя обычно очень хорош).
person David Hammen    schedule 08.07.2011

С меткой можно делать все, что можно сделать с помощью goto. Ярлыки как анти-шаблон Это не делает это хорошей идеей.

То, что вы здесь пытаетесь сделать, не требует вложенных циклов, что вообще избавляет от необходимости использовать метки.

Scanner in = new Scanner(System.in);
System.out.print("\nEnter the limit:");
int limit = in.nextInt();
for (int i = 12; i <= limit; i++) {
    if (i % 10 == 0) continue;
    if (i <= 99) {
        // two digits the same.
        if (i % 10 == i / 10 % 10) continue;
    } else if (i <= 999) {
        // three digits the same.
        if (i % 10 == i / 10 % 10 && i % 10 == i / 100) continue;
    } else {
        System.err.println("Value " + i + " too large to check");
        break;
    }
    System.out.printf("%d,", i);
}
person Peter Lawrey    schedule 08.07.2011