1 2
Операторы в
языке Java — это специальные символы,
которые сообщают транслятору о том, что вы
хотите выполнить операцию с некоторыми
операндами. Некоторые операторы требуют
одного операнда, их называют унарными.
Одни операторы ставятся перед операндами
и называются префиксными, другие —
после, их называют постфиксными
операторами. Большинство же операторов
ставят между двумя операндами, такие
операторы называются инфиксными
бинарными операторами. Существует
тернарный оператор, работающий с тремя
операндами.
В Java имеется 44
встроенных оператора. Их можно разбить на 4
класса - арифметические, битовые,
операторы сравнения и
логические.
Арифметические
операторы
Арифметические
операторы используются для вычислений так
же как в алгебре (см. таблицу со сводкой
арифметических операторов ниже).
Допустимые операнды должны иметь числовые
типы. Например, использовать эти
операторы для работы с логическими типами
нельзя, а для работы с типом char можно,
поскольку в Java тип char — это подмножество
типа int.
|
Оператор
|
Результат
|
Оператор
|
Результат
|
|
+
|
Сложение
|
+ =
|
сложение с присваиванием
|
|
-
|
вычитание (также унарный
минус)
|
-=
|
вычитание с присваиванием
|
|
*
|
Умножение
|
* =
|
умножение с присваиванием
|
|
/
|
Деление
|
/=
|
деление с присваиванием
|
|
%
|
деление по модулю
|
%=
|
деление по модулю с
присваиванием
|
|
++
|
Инкремент
|
--
|
декремент
|
Четыре
арифметических действия
Ниже, в качестве примера,
приведена простая программа,
демонстрирующая использование операторов.
Обратите внимание на то, что операторы
работают как с целыми литералами, так и с
переменными.
class BasicMath
{ public static void int a = 1 + 1;
int
b = a * 3;
main(String
args[]) {
int c = b / 4;
int d = b - а;
int e =
-d;
System.out.println("a
= " +
а);
System.out.println("b
= " +
b);
System.out.println("c
= " +
c);
System.out.println("d
= " +
d);
System.out.println("e
= " +
e);
} }
Исполнив эту программу, вы
должны получить приведенный ниже результат:
C:
\> java BasicMath
a = 2
b = 6
c = 1
d = 4
e = -4
Оператор
деления по модулю
Оператор деления по модулю,
или оператор mod, обозначается символом %.
Этот оператор возвращает остаток от
деления первого операнда на второй. В
отличие от C++, функция mod в Java работает не
только с целыми, но и с вещественными
типами. Приведенная ниже программа
иллюстрирует работу этого оператора.
class Modulus {
public static void main
(String args []) {
int x = 42;
double у = 42.3;
System.out.println("x
mod 10 = " + x % 10);
System.out.println("y
mod 10 = " + у % 10);
} }
Выполнив эту программу, вы
получите следующий результат:
С:\>
Modulus
x mod 10 = 2
y mod 10 = 2.3
Арифметические
операторы присваивания
Для каждого из арифметических
операторов есть форма, в которой
одновременно с заданной операцией
выполняется присваивание. Ниже приведен
пример, который иллюстрирует
использование подобной разновидности
операторов.
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, определен
дополнительный набор операторов, с
помощью которых можно проверять и
модифицировать состояние отдельных битов
соответствующих значений. В таблице
приведена сводка таких операторов.
Операторы битовой арифметики работают с
каждым битом как с самостоятельной
величиной.
|
Оператор
|
Результат
|
Оператор
|
Результат
|
|
~
|
побитовое унарное
отрицание (NOT)
|
|
|
|
&
|
побитовое И (AND)
|
&=
|
побитовое И (AND) с
присваиванием
|
|
|
|
побитовое ИЛИ (OR)
|
|=
|
побитовое ИЛИ (OR) с
присваиванием
|
|
^
|
побитовое исключающее ИЛИ
(XOR)
|
^=
|
побитовое исключающее ИЛИ
(XOR)
с присваиванием
|
|
>>
|
сдвиг вправо
|
>> =
|
сдвиг вправо с
присваиванием
|
|
>>>
|
сдвиг вправо с заполнением
нулями
|
>>>=
|
сдвиг вправо с заполнением
нулями с присваиванием
|
|
<<
|
сдвиг влево
|
<<=
|
сдвиг влево с присваиванием
|
Пример
программы, манипулирующей с битами
В таблице, приведенной ниже,
показано, как каждый из операторов битовой
арифметики воздействует на возможные
комбинации битов своих операндов.
Приведенный после таблицы пример
иллюстрирует использование этих
операторов в программе на языке Java.
|
А
|
В
|
OR
|
AND
|
XOR
|
NOT A
|
|
0
|
0
|
0
|
0
|
0
|
1
|
|
1
|
0
|
1
|
0
|
1
|
0
|
|
0
|
1
|
1
|
0
|
1
|
1
|
|
1
|
1
|
1
|
1
|
0
|
0
|
class Bitlogic {
public static void
main(String
args []) {
String
binary[] = {
"OOOO", "0001", "0010", "0011",
"0100", "0101", "0110", "0111",
"1000", "1001",
"1010", "1011", "1100", "1101",
"1110",
"1111" };
int a = 3;
// 0+2+1
или двоичное 0011
int b = 6;
// 4+2+0
или двоичное 0110
int c = a |
b;
int d = a &
b;
int e = a ^
b;
int f =
(~a & b) | (a & ~b);
int g = ~a & 0x0f;
System.out.println("
a = " + binary[a]);
System.out.println("
b = " + binary[b]);
System.out.println("
ab = " + binary[c]);
System.out.println("
a&b = " + binary[d]);
System.out.println("
a^b = " + binary[e]);
System.out.рrintln("~a&b|а^~Ь
= " + binary[f]);
System.out.println("
~a = " + binary[g]);
} }
Ниже приведен результат,
полученный при выполнении этой программы:
С:
\> Java BitLogic
a = 0011
b = 0110
a | b = 0111
a & b = 0010
a ^ b = 0101
~a & b | a & ~b
= 0101
~а = 1100
Сдвиги
влево и вправо
Оператор << выполняет сдвиг
влево всех битов своего левого операнда на
число позиций, заданное правым операндом.
При этом часть битов в левых разрядах
выходит за границы и теряется, а
соответствующие правые позиции
заполняются нулями. В предыдущей главе уже
говорилось об автоматическом повышении
типа всего выражения до int в том случае
если в выражении присутствуют операнды
типа int или целых типов меньшего размера.
Если же хотя бы один из операндов в
выражении имеет тип long, то и тип всего
выражения повышается до long.
Оператор >>
означает в языке Java сдвиг вправо. Он
перемещает все биты своего левого
операнда вправо на число позиций, заданное
правым операндом.
Когда биты левого операнда
выдвигаются за самую правую позицию слова,
они теряются. При сдвиге вправо
освобождающиеся старшие (левые) разряды
сдвигаемого числа заполняются
предыдущим содержимым знакового разряда.
Такое поведение называют расширением
знакового разряда.
В
следующей программе байтовое значение
преобразуется в строку, содержащую его
шестнадцатиричное представление.
Обратите внимание -
сдвинутое значение приходится
маскировать, то есть логически умножать на
значение 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