Java Управляющие операторы
Primary tabs
Forums:
Рассмотрев "обычные" операторы, перейдём к управляющим.
IF (условный оператор)
Условный операторы if, применяется для построение логического ветвления (две ветки) пути выполнения программы - отслеживает логическое значение выражения заключённого в скобки:
if (value != null) { // проверяется истинность выражения ... // если истинно то можно выполнить ряд операций } else { // если ложно if (map.containsKey(key)) { // некоторое вложенное условие // здесь опять какие -то операции, например: int a = 1; // просто для иллюстрации } else { // если вложенное условие не выполнилось // здесь опять можно что-то сделать } }
SWITCH (оператор ветвления)
Оператор ветвления позволяет создать сколько угодно ветвей для одного выражения, имеет следующую структру:
int month = 8; String monthString; switch (month) { // switch можно вкладывать один в другой (как и if) case 1: monthString = "January"; break; // необходим чтобы выполнение не продолжилось // но при этом break не является обязательным в switch case 2: monthString = "February"; break; case 3: monthString = "March"; break; case 4: monthString = "April"; break; case 5: monthString = "May"; break; case 6: monthString = "June"; break; case 7: monthString = "July"; break; case 8: monthString = "August"; break; case 9: monthString = "September"; break; case 10: monthString = "October"; break; case 11: monthString = "November"; break; case 12: monthString = "December"; break; // действие по умолчанию выполнится (default) если ,например month == 15 // то есть в случае когда значения нет среди вариантов case; default: monthString = "Invalid month"; // действие "по умолчанию" break; // default не обязателен в switch } System.out.println(monthString); // напечатает "Август" - т.к. это иесть восьмой месяц
Цикл while
Цикл while продолжает "повторять" своё тело до тех пор, пока проверочное выражение в скобках истинно, например:
int i=0; int len = data.length; // получаем некоторое значение while (i< len) // пока == true { // здесь какие-нибудь операции i++; наращиваем счётчик, если не хотим "зацикливания" }
Цикл do-while
Иногда такого рода цикл называют циклом с "постусловием" - принципиальное отличие от предыдущего варианта в том, что в случае, если условие ложно - цикл всё-таки выполнится один раз (до первой проверки) - иногда такое свойство оказывается полезным.
Пример:
int i=0; int len = 7; // получаем некоторое значение do { // начало цикла // здесь какие-нибудь операции i++; наращиваем счётчик, если не хотим "зацикливания" } while (i< len) // проверка после итерации
Цикл for
Цикл for выполняется фиксированное число раз и "подразумевает" обязательное наличие счётчика, которым он оперирует в "голове", а не теле, как это могут делать "по желанию" ранее рассмотренные нами циклы.
Мы уже сталкивались с этим циклом (правда, не обсуждая подробностей его работы) когда изучали массивы, оттуда я и возьму пример где будут сразу два цикла - один вложен в другой:
int raz1 = 5; int raz2 = 4; // Создаем двумерный массив // именно его мы и будем "обходить" в циклах ниже char[][] arr = new char[raz1][raz2]; // Цикл по "строкам" for ( // внешний цикл int i = 0; // начальное значение счётчика i < raz1; // условие продолежния ("пока выполнено...") i++ // способ изменения счётика ) { // Цикл по "столбцам" // обычно "голова" цикла записывается в одну строку - // выше мы разделили её на три для удобства комментирования for (int j = 0; j < raz2; j++) { // внутренний цикл arr[i][j] = '#'; // выводим через пробел System.out.print( arr[i][j] + " "); } System.out.print('\n'); // переносим строчку }
Как показано в последнем примере, "голова" цикла делится на три блока - при этому инициалиационная (первая, где устанавливается начальное значение счётчика) часть и итерационная в общем случаем могут включать несколько операций которые можно разделять запятой.
Например цикл:
int a,b; b = 8; for (a = 1; a <= b; a+=2){ // тело цикла b++; // инкремент }
можно переписать так (передвинем некоторые операции в "голову"):
int a,b; for (a = 1, b = 8; a <= b; a+=2, b++){ // тело цикла }
Более того - не обязательно привязывать условие выхода из цикла for к значению счётчика явным образом,
например можно написать так:
int a,b; boolean f = false; for (a = 1, b = 8; !f; a+=2, b++){ if (a > b) f = true; // теперь цикл завершиться // тело цикла (остальные операторы) } // число итераций совпадает с предыдущим примером
for-each версия цикла for
Эта продвинутая версия цикла используется для неявного получения очередного значения коллекции в переменную необходимого типа.
Например такой цикл:
char[] ch = {'a', 'b', 'c'}; for (int i = 0; i < 3; i++) System.out.print( ch[i] + " "); // можно обойти коллекцию (в данном случае - это массив) //и более простым и одновременно "продвинутым" способом: for (char charsymb : ch) System.out.print( charsymb + " "); // в charsymb попадает очередное значение массива
Оператор break
Оператор break, используется для прерывания выполнения программы на уровне блока - выше мы рассмотрели его использование в switch, также break может быть использован для выхода из цикла.
Но также оператор может быть использован и для так называемого "безусловного" перехода, например:
boolean t = true; // далее "искусстсвенно" создаются три блока // (вложенных), каждый из которых помечается меткой first: { second: { third: { // самый "младший" блок System.out.println("Предшествует оператору break."); if(t) break second; // выход из блока second System.out.println("Этот оператор не будет выполняться"); } System.out.println("Этот оператор не будет выполняться"); } System.out.println("Этот оператор следует за блоком second."); } /*после выполнения получим текст: Предшествует оператору break. Этот оператор следует за блоком second.*/
Безусловный переход позволяет быстро выйти, например из цикла, на необходимый уровень вложенности, не загромождая код условными операторами.
Если необходимо применить метку к блоку цикла, то она ставиться точно также слева (как и в последнем пример), а именно:
first: for ( int i = 0; i < raz1; i++ ) { // цикл с меткой inner: for (int j = 0; j < raz2; j++) { // внутренний цикл c меткой // тут тело вложенного цикла if (i >= 2) break first; // выходим из обоих циклов } }
Оператор continue
Позволяет продолжить выполнение "прокинув" текущую итерацию ("виток цикла") целиком или частично (в зависимости от точки вызова), может быть использован без метки -тогда просто останавливается текущий виток для текущего блока цикла и начинается следующий.
Также возможно использование с меткой:
first: for ( int i = 0; i < raz1; i++ ) { // цикл с меткой inner: for (int j = 0; j < raz2; j++) { // внутренний цикл c меткой // тут тело вложенного цикла if (i >= 2) continue first; // пробросим все операции // где i больше либо равно двум } }
Оператор return
Используется для выполнения явного выхода из метода - управление передаётся тому коду, который вызвал данный метод.
Подробнее мы рассмотрим этот оператор, когда будем говорить о классах, но уже сейчас полезно понимать, что после его вызова выполнением метода полностью и "безусловно" прекращается, пример:
public class Test { public static void main(String[] args) { boolean t = true; first: { second: { third: { // самый "младший" блок System.out.println("До RETURN (после уже ничего не будет)))"); if(t) return; // НИЧТО после не выполнится! System.out.println(" не будет выполняться"); } System.out.println(" не будет выполняться"); } System.out.println(" не выполнится."); } /*после выполнения получим текст: До RETURN (после уже ничего не будет)))*/ } }
На этом мы заканчиваем рассмотрение управляющих оператором и движемся дальше =)
- Log in to post comments
- 10067 reads