Шрифт:
После их выполнения значение переменной у будет равно 11. Но если изменить код так, как показано ниже, результат будет другим. х = 10; у = х++;
Теперь значение переменной у равно 10. Но в обоих случаях значение переменной х будет равно 11. Возможность контролировать момент выполнения операции инкремента или декремента дает немало преимуществ при написании программ. Операторы отношения и логические операторы
Операторы отношения отличаются от логических операторов тем, что первые опреде ляют отношения между значениями, а вторые связывают вместе логические значения (true или false), получаемые в результате определения отношений между значениями. Операторы отношения возвращают логическое значение true или false, и поэтому они нередко используются совместно с логическими операторами. По этой причине они и рассматриваются вместе.
Ниже перечислены операторы отношения. Оператор Значение == Равно |= Неравно > Больше < Меньше >= Больше или равно <= Меньше или равно
Далее перечислены логические операторы. Оператор Значение & И | ИЛИ ^ Исключающее ИЛИ || Укороченное ИЛИ && Укороченное И ! НЕ
Результатом выполнения оператора отношения или логического оператора является логическое значение типа boolean.
В Java все объекты могут быть проверены на равенство или неравенство с помощью операторов == и != соответственно. Но операторы <, >, <= и >= могут быть применены только к тем типам данных, для которых определено отношение порядка. Следовательно, все операторы отношения можно применять к данным числовых типов и типа char. А логические значения типа boolean можно проверить только на равенство или неравенство, поскольку истинные (true) и ложные (false) значения не имеют отношения порядка. Например, выражение true > false не имеет смысла в Java.
Операнды логических операторов должны иметь тип boolean, как, впрочем, и результаты выполнения этих операторов. Логические операторы &, |, А и ! выполняют логические операции И, ИЛИ, исключающее ИЛИ и НЕ в соответствии со следующей таблицей истинности. P Q P & Q P | Q P ^ Q !p false false false false false true true false false true true false false true false true true true true true true true false false
Как следует из приведенной выше таблицы, результатом выполнения логической операции исключающее ИЛИ будет истинное значение (true), если один и только один ее операнд имеет логическое значение true.
Приведенный ниже пример программы демонстрирует применение некоторых операторов отношения и логических операторов. // Демонстрация операторов отношения и логических операторов, class RelLogOps { public static void main(String args[]) { int i, j; boolean bl, b2; i = 10; j = 11; if(i < j) System.out.println("i < j"); if(i <= j) System.out.println("i <= j"); if(i != j) System.out.println("i != j"); if(i == j) System.out.println("this won't execute"); if(i >= j) System.out.println("this won't execute"); if(i > j) System.out.println("this won't execute"); bl = true; b2 = false; if(bl & b2) System.out.println("this won't execute"); if(! (bl & b2)) System.out.println("! (bl & b2) is true"); if(bl | b2) System.out.println("bl | b2 is true"); if(bl A b2) System.out.println("bl A b2 is true"); } }
Результат выполнения данной программы выглядит следующим образом: i < j i <= j i != j ! (bl & b2) is true bl | b2 is true bl A b2 is true Укороченные логические операторы
В Java предусмотрены также специальные, укороченные варианты логических операторов И и ИЛИ, предназначенные для получения более эффективного кода. Поясним это на следующих примерах логических операций. Если первый операнд логической операции И имеет ложное значение (false), то ее результат будет иметь ложное значение независимо от значения второго операнда. Если же первый операнд логической операции ИЛИ имеет истинное значение (true), то ее результат будет иметь истинное значение независимо от значения второго операнда. Благодаря тому что значение второго операнда в этих операциях вычислять не нужно, экономится время и повышается эффективность кода.
Укороченная логическая операция И выполняется с помощью оператора 66, а укороченная логическая операция ИЛИ — с помощью оператора | |. Этим укороченным логическим операторам соответствуют обычные логические операторы & и |. Единственное отличие укороченного логического оператора от обычного заключается в том, что второй его операнд вычисляется только по мере необходимости.
В приведенном ниже примере программы демонстрируется применение укороченного логического оператора И. В этой программе с помощью операции деления по модулю определяется следующее: делится ли значение переменной d на значение переменной нацело. Если остаток от деления n/d равен нулю, то п делится на d нацело. Но поскольку данная операция подразумевает деление, то для проверки условия деления на нуль служит укороченный логический оператор И. // Демонстрация укороченных логических операторов, class SCops { public static void main(String args[]) { int n, d, g; n = 10; d = 2; if(d != 0 && (n % d) == 0) System.out.println(d + " is a factor of " + n) ; d = 0; // установить нулевое значение в переменной d // Второй операнд не вычисляется, поскольку значение // переменной d равно нулю. Таким образом, укороченный // логический оператор предотвращает деление на нуль. if (d ! = 0 && (n % d) == 0) // System.out.println(d + " is a factor of " + n) ; /* А теперь те же самые действия выполняются без укороченного логического оператора. На этот раз вычисляются оба операнда, в результате чего возникает ошибка деления на нуль. */ if(d != 0 & (п % d) == 0) System.out.println(d + " is a factor of " + n) ; } }
Для предотвращения возможности деления на нуль в условном операторе if сначала проверяется, равно ли нулю значение переменной d. Если эта проверка дает истинный результат, вычисление второго операнда укороченного логического оператора И не выполняется. Так, если значение переменной d равно 2, вычисляется остаток от деления по модулю. Если же значение переменной d равно нулю, операция деления по модулю пропускается, а следовательно, предотвращается деление на нуль. В конце рассматриваемой здесь программы применяется обычный логический оператор И, в котором вычисляются оба операнда, а это может привести к делению на нуль при выполнении данной программы.
И последнее замечание: в формальной спецификации Java укороченный оператор И называется условным логическим оператором И, а укороченный оператор ИЛИ — условным логическим оператором ИЛИ, но чаще подобные операторы называются укороченными. Оператор присваивания
Оператор присваивания уже не раз применялся в примерах программ, начиная с главы 1. И теперь настало время дать ему формальное определение. Оператор присваивания обозначается одиночным знаком равенства (=). В Java он выполняет те же действия, что и в других языках программирования. Ниже приведена общая форма этого оператора. переменная = выражение