![]() |
Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Арифметические операторы присваиванияСтр 1 из 10Следующая ⇒
Для каждого из арифметических операторов есть форма, в которой одновременно с заданной операцией выполняется присваивание. Ниже приведен пример, который иллюстрирует использование подобной разновидности операторов. class OpEquals { public static void main(String args[]) { int a = 1; int b = 2; int с = 3; a += 5; b *= 4; c += a * b; с %= 6; System.out.println(" a = " + a); System.out.println(" b = " + b); System.out.println(" c = " + c); } } А вот и результат, полученный при запуске этой программы: С: > Java OpEquals а = 6 b = 8 с = 3 Инкремент и декремент В С существует 2 оператора, называемых операторами инкремента и декремента (++ и --) и являющихся сокращенным вариантом записи для сложения или вычитания из операнда единицы. Эти операторы уникальны в том плане, что могут использоваться как в префиксной, так и в постфиксной форме. Следующий пример иллюстрирует использование операторов инкремента и декремента. class IncDec { public static void main(String args[]) { int a = 1; int b = 2; int c = ++b; int d = a++; c++; System.out.println(" a = " + a); System.out.println(" b = " + b); System.out.println(" c = " + c); System.out.println(" d = " + d); } } Результат выполнения данной программы будет таким: C: \ java IncDec a = 2 b = 3 c = 4 d = 1 Целочисленные битовые операторы Для целых числовых типов данных - long, int, short, char и byte, определен дополнительный набор операторов, с помощью которых можно проверять и модифицировать состояние отдельных битов соответствующих значений. В таблице приведена сводка таких операторов. Операторы битовой арифметики работают с каждым битом как с самостоятельной величиной.
Сдвиги влево и вправо
В следующей программе байтовое значение преобразуется в строку, содержащую его шестнадцатиричное представление. Обратите внимание - сдвинутое значение приходится маскировать, то есть логически умножать на значение 0х0f, для того, чтобы очистить заполняемые в результате расширения знака биты и по-низить значение до пределов, допустимых при индексировании массива шестнадцатиричных цифр. class HexByte { static public void main(String args[]) { char hex[] = { '0', '1, '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f }; byte b = (byte) 0xf1; System.out.println(" b = 0x" + hex[(b > > 4) & 0x0f] + hex[b & 0x0f]); } } Ниже приведен результат работы этой программы: С: \> java HexByte b = 0xf1 Беззнаковый сдвиг вправо Часто требуется, чтобы при сдвиге вправо расширение знакового раз-ряда не происходило, а освобождающиеся левые разряды просто запол-нялись бы нулями. class ByteUShift { static public void main(String args[]) { char hex[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'а', 'b', 'с', 'd', 'e', 'f' }; byte b = (byte) 0xf1; byte c = (byte) (b > > 4); byte d = (byte) (b > > 4); byte e = (byte) ((b & 0xff) > > 4); System.out.println(" b = 0x" + hex(b > > 4) & 0x0f] + hex[b & 0x0f]); System.out.println(" b > > 4 = 0x" + hex[(c > > 4) & 0x0f] + hex[c & 0x0f]); System.out.println(" b > > > 4 = 0x" + hex[(d > > 4) & 0x0f] + hex[d & 0x0f]); System.out.println(" (b & 0xff) > > 4 = 0x" + hex[(e > > 4) & 0x0f] + hex[e & 0x0f]); } } Для этого примера переменную b можно было бы инициализировать произвольным отрицательным числом, мы использовали число с шест-надцатиричным представлением 0xf1. Переменной с присваивается ре-зультат знакового сдвига b вправо на 4 разряда. Как и ожидалось, рас-ширение знакового разряда приводит к тому, что 0xf1 превращается в 0xff. Затем в переменную d заносится результат беззнакового сдвига b вправо на 4 разряда. Можно было бы ожидать, что в результате d со-держит 0x0f, однако на деле мы снова получаем 0xff. Это - результат расширения знакового разряда, выполненного при автоматическом по-вышении типа переменной b до int перед операцией сдвига вправо. На-конец, в выражении для переменной е нам удается добиться желаемого результата - значения 0x0f. Для этого нам пришлось перед сдвигом вправо логически умножить значение переменной b на маску 0xff, очис-тив таким образом старшие разряды, заполненные при автоматическом повышении типа. Обратите внимание, что при этом уже нет необходи-мости использовать беззнаковый сдвиг вправо, поскольку мы знаем со-стояние знакового бита после операции AND. С: \> java ByteUShift b = 0xf1 b > > 4 = 0xff b > > > 4 = 0xff b & 0xff) > > 4 = 0x0f Битовые операторы присваивания Так же, как и в случае арифметических операторов, у всех бинарных битовых операторов есть родственная форма, позволяющая автоматичес-ки присваивать результат операции левому операнду. В следующем примере создаются несколько целых переменных, с ко-торыми с помощью операторов, указанных выше, выполняются различ-ные операции. class OpBitEquals { public static void main(String args[]) { int a = 1; int b = 2; int с = 3; a |= 4; b > > = 1; с Результаты исполнения программы таковы: С: \> Java OpBitEquals а = 3 b = 1 с = 6
Операторы отношения Для того, чтобы можно было сравнивать два значения, в Java имеется набор операторов, описывающих отношение и равенство. Список таких операторов приведен в таблице.
Значения любых типов, включая целые и вещественные числа, символы, логические значения и ссылки, можно сравнивать, используя оператор проверки на равенство == и неравенство! =. Обратите внимание - в языке Java, так же, как в С и C++ проверка на равенство обозначается последовательностью (==). Один знак (=) - это оператор присваивания. Булевы логические операторы
Программа, приведенная ниже, практически полностью повторяет уже знакомый вам пример BitLogic. Только но на этот раз мы работаем с булевыми логическими значениями. class BoolLogic { public static void main(String args[]) { boolean a = true; boolean b = false; boolean с = a | b; boolean d = a & b; boolean e = a ^ b; boolean f = (! a & b) | (a & ! b); boolean g =! a; System.out.println(" a = " + a); System.out.println(" b = " + b); System.out.println(" a|b = " + c); System.out.println(" a& b = " + d); System.out.println(" a^b = " + e); System.out.println("! a& b|a&! b = " + f);
System.out.println(" ! a = " + g); } } С: \> Java BoolLogic а = true b = false a|b = true a& b = false a^b = true ! a& b|a&! b = true ! a = false
Операторы быстрой оценки логических выражений (short circuit logical operators) Существуют два интересных дополнения к набору логических опера-торов. Это - альтернативные версии операторов AND и OR, служащие для быстрой оценки логических выражений. Вы знаете, что если первый операнд оператора OR имеет значение true, то независимо от значения второго операнда результатом операции будет величина true. Аналогично в случае оператора AND, если первый операнд - false, то значение вто-рого операнда на результат не влияет - он всегда будет равен false. Если вы в используете операторы & & и || вместо обычных форм & и |, то Java не производит оценку правого операнда логического выражения, если ответ ясен из значения левого операнда. Общепринятой практикой является использование операторов & & и || практически во всех случаях оценки булевых логических выражений. Версии этих операторов & и | применяются только в битовой арифметике. Популярное: |
Последнее изменение этой страницы: 2016-07-14; Просмотров: 694; Нарушение авторского права страницы