Java: руководство для начинающих
Шрифт:
В Java предусмотрено большое количество операторов. Оператор — это знак, указы вающий компилятору на необходимость выполнения определенного математического или логического действия. Операторы в Java делятся на четыре общие категории: арифметические, поразрядные, логические и отношения. Кроме того, в Java определены некоторые дополнительные операторы для применения в особых случаях. В этой главе будут рассмотрены арифметические и логические операторы, а также операторы отношения присваивания. А о поразрядных и специальных операторах речь пойдет далее в этой книге. Арифметические операторы
В языке Java определены следующие арифметические операторы. Оператор Выполняемое действие + Сложение (а также унарный
Операторы +, -, * и / действуют в Java таким же образом, как и в любом другом языке программирования в частности и математике вообще, т.е. выполняют обычные арифметические операции. Их можно применять к числовым данным встроенных типов. Они также применимы к объектам типа char.
Несмотря на то что арифметические операции хорошо всем известны, у них имеются некоторые особенности, требующие специального пояснения. Во-первых, если оператор / применяется к целым числам, остаток от деления отбрасывается. Например, результат целочисленного деления 10/3 равен 3. А для получения остатка от деления следует применить оператор деления по модулю %. В Java он действует таким же образом, как и в других языках программирования. Например, в результате операции 10 % 3 будет получено значение 1. Оператор % применяется не только к целым числам, но и к числам с плавающей точкой. Следовательно, в результате операции 10,0 % 3,0 также будет получено значение 1. Ниже приведен пример программы, демонстрирующий применение оператора %. // Демонстрация оператора %. class ModDemo { public static void main(String args[]) { int iresult, irem; double dresult, drem; iresult = 10 / 3; irem = 10 % 3; dresult = 10.0 / 3.0; drem = 10.0 % 3.0; System.out.println("Result and remainder of 10 / 3: " + iresult + " " + irem); System.out.println("Result and remainder of 10.0 / 3.0: " + dresult + " " + drem); } }
Выполнение этой программы дает следующий результат: Result and remainder of 10 / 3: 3 1 Result and remainder of 10.0 / 3.0: 3.3333333333333335 1.0
Как видите, оператор % возвращает остаток от деления как целых чисел, так и чисел с плавающей точкой. Операторы инкремента и декремента
Операторы ++ и —, выполняющие положительное (инкремент) и отрицательное (декремент) приращение значений, были уже представлены в главе 1. Как будет показано ниже, у этих операторов имеется ряд интересных особенностей. Рассмотрим подробнее действия, выполняемые операторами инкремента и декремента.
Оператор инкремента добавляет к своему операнду единицу, а оператор декремента вычитает единицу из операнда. Следовательно, оператор х = х + 1;
дает такой же результат, как и оператор х++;
а оператор х = х - 1;
дает такой же результат, как и оператор —х;
Оба оператора инкремента и декремента могут быть как префиксным (предварять операнд), так и постфиксным (следовать за операндом). Например, оператор х = х + 1;
можно переписать так: ++х; // префиксная форма
или так: х++; // постфиксная форма
В приведенных выше примерах не имело особого значения, применять ли оператор инкремента в префиксной или постфиксной форме. Но когда операторы инкремента и декремента являются частью более крупного выражения, отличия между этими формами уже имеют значение. Так, если оператор инкремента или декремента предшествует операнду, то сначала выполняется соответствующее приращение, а затем получается значение операнда для последующего его использования в других элементах выражения. А если оператор инкремента или декремента следует за операндом, то сначала получается значение операнда, а затем выполняется инкремент или декремент. Рассмотрим следующие строки кода: х = 10; у = ++х;
После их выполнения значение переменной у будет равно 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), то ее результат будет иметь истинное значение независимо от значения второго операнда. Благодаря тому что значение второго операнда в этих операциях вычислять не нужно, экономится время и повышается эффективность кода.