it-swarm.com.ru

Как правильно использовать оператор goto

Я учусь в школе по информатике. 

Я решил бросить выражение goto в одну из наших лабораторий, просто чтобы поиграть, но я получил эту ошибку. 

Exception in thread "main" Java.lang.Error: Unresolved compilation problems: 
    Syntax error on token "goto", assert expected
    restart cannot be resolved to a variable
at Chapter_3.Lab03_Chapter3.Factorial.main(Factorial.Java:28)

Я обратился к вопросу goto в Stackoverflow, чтобы узнать, как это сделать правильно, и я поступил именно так, как было продемонстрировано в одном из ответов. Я действительно не понимаю, почему компилятор хочет оператор assert (по крайней мере, это то, что я предполагаю, что он хочет), и при этом я не знаю, как использовать assert. Кажется, требуется, чтобы часть перезапуска goto restart; была переменной, но перезапуск - это просто метка, которая возвращает программу обратно в строку 10, чтобы пользователь мог ввести действительную переменную int. Если он хочет, чтобы перезагрузка была переменной, как мне это сделать?

import Java.util.*;

public class Factorial 
{
    public static void main(String[] args) 
    {
        int x = 1;
        int factValue = 1;
        Scanner userInput = new Scanner(System.in);
        restart:
        System.out.println("Please enter a nonzero, nonnegative value to be factorialized.");
        int factInput = userInput.nextInt();

        while(factInput<=0)
        {
            System.out.println("Enter a nonzero, nonnegative value to be factorialized.");
            factInput = userInput.nextInt();
        }

        if(x<1)//This is another way of doing what the above while loop does, I just wanted to have some fun.
        {
            System.out.println("The number you entered is not valid. Please try again.");
            goto restart;
        }
        while(x<=factInput)
        {
            factValue*=x;
            x++;
        }
        System.out.println(factInput+"! = "+factValue);
        userInput.close();
    }
}
26
Ungeheuer

Как уже указывалось во всех ответах goto - зарезервированное слово в Java и не используется в языке.

restart: называется идентификатором, за которым следует двоеточие.

Вот несколько вещей, о которых нужно позаботиться, если вы хотите добиться поведения similar

outer:                  // Should be placed exactly before the loop
loopingConstructOne  {  // We can have statements before the outer but not inbetween the label and the loop          
    inner:
    loopingConstructTwo {
        continue;       // This goes to the top of loopingConstructTwo and continue.
        break;          // This breaks out of loopingConstructTwo.
        continue outer; // This goes to the outer label and reenters loopingConstructOne.
        break outer;    // This breaks out of the loopingConstructOne.
        continue inner; // This will behave similar to continue.
        break inner;    // This will behave similar to break.
    }
}

Я не уверен, должен ли я сказать similar, как у меня уже есть.

65
Tirath

Список ключевых слов Java определяет ключевое слово goto, но оно помечено как «не используется».

Вероятно, это было сделано на случай, если он будет добавлен в более позднюю версию Java.

Если бы goto не было в списке, и оно было добавлено к языку позже, существующий код, который использовал Word goto в качестве идентификатора (имя переменной, имя метода и т.д.), Сломался бы. Но поскольку goto является ключевым словом, такой код даже не будет компилироваться в настоящее время, и остается возможность заставить его действительно что-то делать позже, не нарушая существующий код.

12
Aditya Singh

Если вы посмотрите вверх, продолжите и сломайте, они примут «Метку». Экспериментируйте с этим. Сам Гото не сработает.

public class BreakContinueWithLabel {

    public static void main(String args[]) {

        int[] numbers= new int[]{100,18,21,30};

        //Outer loop checks if number is multiple of 2
        OUTER:  //outer label
        for(int i = 0; i<numbers.length; i++){
            if(i % 2 == 0){
                System.out.println("Odd number: " + i +
                                   ", continue from OUTER label");
                continue OUTER;
            }

            INNER:
            for(int j = 0; j<numbers.length; j++){
                System.out.println("Even number: " + i +
                                   ", break  from INNER label");
                break INNER;
            }
        }      
    }
}

Прочитайте больше

10
Bill K

Java не поддерживает goto, она зарезервирована как ключевое слово на случай, если они захотят добавить ее в более позднюю версию

3
Daniel Cardoso

goto ничего не делает в Java.

3
Sizik

Java также не использует номера строк, что необходимо для функции GOTO. В отличие от C/C++, в Java нет оператора goto, но Java поддерживает метки. Единственное место, где метка полезна в Java - это прямо перед операторами вложенного цикла. Мы можем указать имя метки с помощью break, чтобы разорвать конкретный внешний цикл.

2
user6224849

В мире Java нет «goto». Основная причина заключалась в том, что разработчики осознали, что сложные коды, имеющие goto, приведут к тому, что код станет по-настоящему патетичным, и будет практически невозможно улучшить или поддерживать код. 

Однако этот код можно немного модифицировать, и, используя концепцию продолжения и прерывания, мы можем заставить код работать.

    import Java.util.*;

public class Factorial 
{
    public static void main(String[] args) 
    {
        int x = 1;
        int factValue = 1;
        Scanner userInput = new Scanner(System.in);
        restart: while(true){
        System.out.println("Please enter a nonzero, nonnegative value to be factorialized.");
        int factInput = userInput.nextInt();

        while(factInput<=0)
        {
            System.out.println("Enter a nonzero, nonnegative value to be factorialized.");
            factInput = userInput.nextInt();
        }

        if(x<1)//This is another way of doing what the above while loop does, I just wanted to have some fun.
        {
            System.out.println("The number you entered is not valid. Please try again.");
            continue restart;
        }
        while(x<=factInput)
        {
            factValue*=x;
            x++;
        }
        System.out.println(factInput+"! = "+factValue);
        userInput.close();
        break restart;
}
    }
}
0
Sohail Sankanur

goto - неиспользуемое зарезервированное слово в языке. Так что нет goto. Но, если вы хотите абсурдистский театр, вы можете уговорить одного из языковых особенностей маркировки. Но вместо того, чтобы маркировать цикл for, который иногда полезен, вы маркируете блок кода. В этом блоке кода вы можете вызывать break на метке, выплевывая вас до конца блока кода, который по сути является goto, который только переходит вперед в коде.

    System.out.println("1");
    System.out.println("2");
    System.out.println("3");
    my_goto:
    {
        System.out.println("4");
        System.out.println("5");
        if (true) break my_goto;
        System.out.println("6");
    } //goto end location.
    System.out.println("7");
    System.out.println("8");

Это напечатает 1, 2, 3, 4, 5, 7, 8. Поскольку разрыв кодового блока перешел сразу после кодового блока. Вы можете перемещать операторы my_goto: { и if (true) break my_goto; и } //goto end location.. Важно то, что разрыв должен находиться внутри помеченного блока кода.

Это даже страшнее, чем настоящий goto. Никогда на самом деле не делай этого.

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

0
Tatarize