понедельник, 5 ноября 2018 г.

Операторы if, else, swich, case

Ключевое слово if выполняет условную проверку, оценивая логическое значение  выражения. Оператор, следующий за этим выражением, будет выполняться, только если данное значение равно true (истина). В противном случае программа переходит на последующие строки кода, выполняя альтернативное ветвление.
Синтаксис оператора  if выглядит следующим образом:

 if ( проверочное-выражение ) код-для-исполнения-если-результат-истина ;

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

Логический оператор И (&&) будет возвращать true, только если оба проверяемых выражения имеют значение true:

if ( ( условие-1 ) && ( условие-2 ) ) исполнить-этот-код ; 

Логический оператор ИЛИ (||) будет возвращать значение true, если хотя бы одно из проверочных выражений имеет значение true:

if ( (условие-1 ) || ( условие-2) ) исполнить-этот-код ;

Комбинации вышеуказанных выражений могут составлять более сложные и длинные проверочные выражения. 
В дополнение к ключевому слову if можно использовать ключевое слово else, которое вместе с if образует оператор if else, обеспечивающий альтернативные ветви для продолжения программы в соответствии с результатом оценки проверочного выражения. В простейшем случае он просто предлагает альтернативный оператор для исполнения, а когда проверка не успешна — выдает значение false:

if (проверочное-выражение) 
     код-для-исполнения-если-результат-истина; 
else 
     код-для-исполнения-если-результат-ложь ; 

Каждая альтернативная ветвь может являться либо отдельным оператором, либо блоком операторов, заключенным внутри фигурных скобок . При помощи оператора if else можно строить более сложные конструкции для осуществления дополнительных проверок внутри каждой из ветвей if и else. При этом получаются вложенные операторы if. Когда программа обнаруживает выражение, оцененное как true, она исполняет операторы, связанные с этой ветвью, а затем выходит из оператора if else.

if(a<b)
  a=a+1;
else if(a==b)
      a=a+1;
    else{
      a=a+1;
      b=b+1;
    }

Неприятной проблемой, унаследованной в Java от языка C, является возможность использования оператора присваивания "=" вместо оператора сравнения "=="
Например, если мы используем булевские переменные b1 и b2, и вместо
if(b1==b2)
  i=1;
else
  i=2;
напишем
if(b1=b2)
  i=1;
else
  i=2;
никакой диагностики ошибки выдано не будет. 
Дело в том, что по правилам C Java любое присваивание рассматривается как функция, возвращающая в качестве результата присваиваемое значение. Поэтому присваивание b1=b2 возвратит значение, хранящееся в переменной b2. В результате оператор будет работать, но совсем не так, как ожидалось. Более того, будет испорчено значение, хранящееся в переменной b1.

Оператор выбора switch

Является аналогом if для нескольких условий выбора. Синтаксис оператора следующий:
switch(выражение){
  case значение1: операторы1;
  ……………………………
  case значениеN: операторы N;
  default: операторы;
}
Правда, крайне неудобно, что нельзя ни указывать диапазон значений, ни перечислять через запятую значения, которым соответствуют одинаковые операторы.
Тип выражения должен быть каким-нибудь из целых типов. В частности, недопустимы вещественные типы.
Работает оператор следующим образом: сначала вычисляется выражение. Затем вычисленное значение сравнивается со значениями вариантов, которые должны быть определены еще на этапе компиляции программы. Если найден вариант, которому удовлетворяет значение выражения, выполняется соответствующий этому варианту последовательность операторов, после чего НЕ ПРОИСХОДИТ выхода из оператора case, что было бы естественно. - Для такого выхода надо поставить оператор break.Эта неприятная особенность Java унаследована от языка C.
Часть с default является необязательной и выполняется, если ни один вариант не найден.
Пример:
switch(i/j){
    case 1:
        i=0;
        break;
    case 2:
        i=2;
        break;
    case 10:
        i=3;
        j=j/10;
        break;
    default:
        i=4;
};
У оператора switch имеется две особенности:
  • Можно писать произвольное число операторов для каждого варианта case, что весьма удобно, но полностью выпадает из логики операторов языка Java.
  • Выход из выполнения последовательности операторов осуществляется с помощью оператора break. Если он отсутствует, происходит "проваливание" в блок операторов, соответствующих следующему варианту за тем, с которым совпало значение выражения. При этом никакой проверки соответствия очередному значению не производится. И так продолжается до тех пор, пока не встретится оператор break или не кончатся все операторы в вариантах выбора. Такие правила проверки порождают типичную ошибку, называемую "забытый break ".

Условное выражение …?... : …

Эта не очень удачная по синтаксису функция унаследована из языка C. Ее синтаксис таков:
условие?значение1:значение2
В случае, когда условие имеет значение trueфункция возвращает значение1, в противном случае возвращается значение2.
Например, мы хотим присвоить переменной j значение, равное i+1 при i<5, и i+2 в других случаях. Это можно сделать таким образом:
j=i<5?i+1:i+2
Иногда при вычислении громоздких выражений этот оператор приходится использовать: без него программа оказывается еще менее прозрачной, чем с ним. Приоритет разделителей "?" и ":" очень низкий – ниже только приоритет оператора присваивания (в любых его формах). Поэтому можно писать выражения без использования скобок. Но лучше все-таки использовать скобки:
j=(i<5)?(i+1):(i+2)

Комментариев нет:

Отправить комментарий