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
- 10454 reads