Я не понимаю вывод следующего фрагмента Java с break + label (например, goto на других языках) - PullRequest
0 голосов
/ 01 августа 2020

Я не понимаю вывод следующего кода:

public class testBreak
{

    public static void runTest()
    {
    high_level:
        {
            System.out.println("\nEnter in High Level");
        middle_level: 
            for(int i = 0; i < 4; i++)
            {
                System.out.println("Enter in Middle level cicle");
                int j = 0;
            low_level:  
                while(j++ < 2)
                {
                    System.out.println("Enter in Low level cicle");
                    System.out.println("i = " + i + ";j = " + j);
                    switch(i)
                    {
                        case 0 : break;
                        case 1 : break low_level;
                        case 2 : break middle_level;
                        case 3 : break high_level;
                    }
                    System.out.println("Exit from Low level cicle");
                }
                System.out.println("Exit from Middle level cicle");
            }
            System.out.println("Exit from High level cicle");
        }
    }
    
    public static void main(String args[])
    {
        runTest();
    }

}

Вот результат:

Enter in High Level
Enter in Middle level cicle
Enter in Low level cicle
i = 0;j = 1
Exit from Low level cicle
Enter in Low level cicle
i = 0;j = 2
Exit from Low level cicle
Exit from Middle level cicle
Enter in Middle level cicle
Enter in Low level cicle
i = 1;j = 1
Exit from Middle level cicle
Enter in Middle level cicle
Enter in Low level cicle
i = 2;j = 1
Exit from High level cicle

Я понимаю до строки i = 1;j = 1, но почему это go до Exit from Middle level cicle, а не Enter in low level cicle, потому что у нас j = 1, а while (j ++ <2) должно принимать 1 <2, затем увеличить j до 2 и войти в цикл низкого уровня, как это было в первом запустить ?? </p>

editet: Кажется, break с меткой не равно goto, он выходит из метки l oop? и l oop не является бесплатным в коде, как в C / C ++, но применяется к этому конкретному l oop?

Ответы [ 2 ]

0 голосов
/ 01 августа 2020

Взято из учебника Java от Oracle:

Оператор break завершает помеченный оператор; он не передает поток управления метке. Поток управления передается в оператор, следующий сразу за помеченным (завершенным) оператором.

Это ответ на ваш вопрос?

0 голосов
/ 01 августа 2020

Когда i = 1, вы говорите ему вырваться из метки low_level. L oop под low_level останавливает цикл, а затем печатает Exit from Middle level cicle. Делая это, вы затем снова l oop под middle_level l oop, поэтому он затем печатает Enter in Middle level cicle.

...