Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: вопрос по заданию из учебника  (Прочитано 11885 раз)
0 Пользователей и 1 Гость смотрят эту тему.
bannndi
Гость
« : 18-03-2009 14:27 » 

Всем здравствуйте
Я новичок в java,вопрос будет для знающих скорее всего глупым и пустячным, но обращусь все же:
разбираю задание, и вопрос по коду(код работает). Наверное буду неверные термины использовать - поправьте пож-ста:
1 - boolean t=true; - объявили булин t и определили тру
2 -  a:
        {b:
        {c: - это вложенные в друг друга блоки
вопрос - не могу понять почему по "if(t) break b;" пропускаются именно оба "не будет выполнено"? Жутко путаюсь в скобках, поэтому наведите пож-ста на мысль как выполнить первый "не будет выполнено", а второй пропустить?
И попутный вопрос - что значит break с меткой или без метки? Для чего эти метки? В нотации очень коротко об этом, где можно прочесть?

 
Код:
public class Break {
    public static void main(String args[])
        {
            boolean t=true;
         a:
        {b:
        {c:
        {
            System.out.println("Перед break");
            if(t) break b;
            System.out.println("не будет выполнено");
        }
            System.out.println("не будет выполнено");
        }
            System.out.println("После b");
        }
    }
}
« Последнее редактирование: 18-03-2009 14:35 от bannndi » Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 18-03-2009 14:37 » 

bannndi, разве что, поменять местами строку с break и следующую за ней (или переместить вывод строки в блок условного оператора, опять же до break). Ведь ты по команде break покидаешь блок b - то есть, перемещаешься за его конец (соответственно, покидаешь и вложенный блок c).
Записан
bannndi
Гость
« Ответ #2 : 18-03-2009 15:04 » 

bannndi, разве что, поменять местами строку с break и следующую за ней (или переместить вывод строки в блок условного оператора, опять же до break). Ведь ты по команде break покидаешь блок b - то есть, перемещаешься за его конец (соответственно, покидаешь и вложенный блок c).
Спасибо,Вад - получилось. А по доп вопросу не поможете?
И еще - почему из
            System.out.println("не будет выполнено");
        }
            System.out.println("не будет выполнено");
        }
            System.out.println("После b");
        }
первые две относятся к "b", а 3-я к "с"? Никак не сориентируюсь.
Сейчас должен бежать, но вернусь и отвечу, спасибо большое!
« Последнее редактирование: 18-03-2009 15:07 от bannndi » Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 18-03-2009 15:23 » 

Насколько я понимаю, break с меткой относится к именованным блокам и служит для явного указания, какой блок мы покидаем (наверное, это в каких-то случаях удобно, когда нужно досрочно прекратить выполнение не только вложенного блока - как у тебя "c", но и внешнего блока). 
Break без метки - для выхода из блока цикла или из блока ветвления switch.

3я строка не относится ни к "c", ни к "b".
Записан
bannndi
Гость
« Ответ #4 : 18-03-2009 17:00 » 

3я строка не относится ни к "c", ни к "b".
Остается "а"? Для меня пока непонятно,буду дальше думать
Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #5 : 18-03-2009 17:05 » 

System.out.println("После b"); относится к a:
Код:
    a:
    {
        ...вложенные блоки...
        System.out.println("После b");
    }
Записан
bannndi
Гость
« Ответ #6 : 18-03-2009 17:32 » 

System.out.println("После b"); относится к a:
Кажись понял, Inkognito - блок "с" вообще был пустой. Я его задействовал и вроде бы нормально получилось, + скобки поменял по другому, спасибо!
 
Код:
public class Break {
    public static void main(String args[])
        {
            boolean t=true;
         a:
        {b:
        {c:
        {
            System.out.println("в с");
        }
            System.out.println("Перед break");
            if(t) break b;
            System.out.println("не будет выполнено");

            System.out.println("не будет выполнено");
        }
            System.out.println("После b");
        }
    }
}
« Последнее редактирование: 18-03-2009 17:35 от bannndi » Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 18-03-2009 18:03 » 

Не был блок C пустым. Блок C - это то, что было после "c:". Я бы переписал фрагмент с именованными блоками так (для последнего процитированного кода):
Код:
a: {
    b: {
          c: {
              System.out.println("в с");
          } // end of c

          System.out.println("Перед break");
          if(t) break b;
          System.out.println("не будет выполнено");
          System.out.println("не будет выполнено");
    } // end of b
    System.out.println("После b");
} // end of a
имхо, оно так понагляднее, где какой блок
Записан
bannndi
Гость
« Ответ #8 : 18-03-2009 18:53 » 

Действительно - намного понятнее, Вад!
Не был блок C пустым.
Я почему сказал что "с" был пустым - intellij idea насчет "с" выдала типа "remove unused label", и когда удалил "с", результат не изменился (в первоначальном коде). Ну, сейчас то точно "с" не пустой!
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 18-03-2009 18:56 » 

Думаю, он был unused, поскольку сама метка никем не использовалась, а блок на самом глубоком уровне вложенности находился. В общем, так, придирка-предупреждение насчёт избыточной метки - мол, из соображений чистоты лучше без неё.
Записан
bannndi
Гость
« Ответ #10 : 18-03-2009 19:03 » 

Думаю, он был unused
Почти правильно значит я понял, буду дальше учить, спасибо!
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines