- •Вступление. О книге и не только
- •Объектно-ориентированное программирование и Java
- •Часть I. Введение в Java Глава 1. Основы Java
- •Простые программы
- •Комментарии
- •Простые типы данных и литералы
- •Приведение типов
- •Основные операторы Java
- •Глава 2. Управляющие инструкции Java
- •Условная инструкция if()
- •Условная инструкция switch()
- •Инструкция цикла for()
- •Инструкция цикла while()
- •Инструкция do-while()
- •Метки и инструкции break() и continue()
Основные операторы Java
Мне кажется, давно уже пора приступить к разработке документа, в котором будет четко оговорено, что граждане могут делать в свое свободное время, а чего они делать не должны.
Из к/ф «Забытая мелодия для флейты»
Все операторы Java можно разделить на четыре группы: арифметические, логиче- ские, побитовые и сравнения. Рассмотрим последовательно каждую группу опе- раторов. Начнем с арифметических. Эти операторы перечислены в табл. 1.2.
Таблица 1.2. Арифметические операторы Java
Оператор |
Название |
Пояснение |
+ |
Сложение |
Бинарный оператор. Результатом команды a+b являет- ся сумма значений переменных a и b |
- |
Вычитание |
Бинарный оператор. Результатом команды a-b являет- ся разность значений переменных a и b |
* |
Умножение |
Бинарный оператор. Результатом команды a*b являет- ся произведение значений переменных a и b |
/ |
Деление |
Бинарный оператор. Результатом команды a/b являет- ся частное от деления значений переменных a и b. Для целочисленных операндов по умолчанию выполняется деление нацело |
% |
Остаток |
Бинарный оператор. Результатом команды a%b яв- ляется остаток от целочисленного деления значений переменных a и b |
+= |
Сложение (упро- щенная форма с присваиванием) |
Упрощенная форма оператора сложения с присваива- нием. Команда a+=b является эквивалентом команды a=a+b |
-= |
Вычитание (упро- щенная форма с присваиванием) |
Упрощенная форма оператора вычитания с присваива- нием. Команда a-=b является эквивалентом команды a=a-b |
*= |
Умножение (упро- щенная форма с присваиванием) |
Упрощенная форма оператора умножения с присваи- ванием. Команда a*=b является эквивалентом команды a=a*b |
/= |
Деление (упро- щенная форма с присваиванием) |
Упрощенная форма оператора деления с присваива- нием. Команда a/=b является эквивалентом команды a=a/b |
%= |
Остаток (упро- щенная форма) |
Упрощенная форма оператора вычисления остатка с присваиванием. Команда a%=b является эквивален- том команды a=a%b |
++ |
Инкремент |
Унарный оператор. Команда a++ (или ++a) является эквивалентом команды a=a+1 |
-- |
Декремент |
Унарный оператор. Команда a-- (или --a) является эквивалентом команды a=a-1 |
Эти операторы имеют некоторые особенности. В первую очередь обращаем вни- мание на оператор деления /. Если операндами являются целые числа, в ка- честве значения возвращается результат целочисленного деления. Рассмотрим последовательность команд:
int a=5,b=2; double x=a/b;
В данном примере переменная x получает значение 2.0, а не 2.5, как можно было бы ожидать. Дело в том, что сначала вычисляется выражение a/b. Поскольку
операнды целочисленные, выполняется целочисленное деление. И только по- сле этого полученное значение преобразуется к формату double и присваивается переменной x.
Для того чтобы при целочисленных операндах выполнялось обычное деление, перед выражением с оператором деления указывается в круглых скобках иден- тификатор типа double (или float). Например, так:
int a=5,b=2;
double x=(double)a/b;
Теперь значение переменной x равно 2.5.
В Java, как и в С++, есть группа упрощенных арифметических операторов с присваиванием. Если op — один из операторов сложения, умножения, деления и вычисления остатка, то упрощенная форма этого оператора с присваиванием имеет вид op=. Это тоже бинарный оператор, как и оператор op, а команда вида x op=y является эквивалентом команды x=x op y.
Еще два исключительно полезных унарных оператора — операторы инкремента (++) и декремента (--). Действие оператора декремента сводится к увеличению на единицу значения операнда, а оператор декремента на единицу уменьшает операнд. Другими словами, команда x++ эквивалентна команде x=x+1, а команда x-- эквивалентна команде x=x-1. У операторов инкремента и декремента есть не только представленная здесь постфиксная форма (оператор следует после опе- ранда: x++ или x--), но и префиксная (оператор располагается перед операндом:
++x или --x). С точки зрения действия на операнд нет разницы в том, префикс- ная или постфиксная формы оператора использованы. Однако если выражение с оператором инкремента или декремента является частью более сложного вы- ражения, различие в префиксной и постфиксной формах операторов инкремента и декремента существует. Если использована префиксная форма оператора, сна- чала изменяется значение операнда, а уже после этого вычисляется выражение. Если использована постфиксная форма оператора, сначала вычисляется выраже- ние, а затем изменяется значение операнда. Рассмотрим небольшой пример:
int n,m; n=10;
m=n++;
В этом случае после выполнения команд переменная n будет иметь значение 11, а переменная m — значение 10. На момент выполнения команды m=n++ значение переменной n равно 10. Поскольку в команде m=n++ использована постфиксная форма оператора инкремента, то сначала выполняется присваивание значения переменной m, а после этого значение переменной n увеличивается на единицу.
Иной результат выполнения следующих команд:
int n,m; n=10;
m=++n;
Обе переменные (n и m) в этом случае имеют значение 11. Поскольку в команде m=++n использована префиксная форма инкремента, сначала на единицу увели- чивается значение переменной n, а после этого значение переменной n присваи- вается переменной m.
Следующую группу образуют логические операторы. Операндами логических операторов являются переменные и литералы типа boolean. Логические опера- торы Java перечислены в табл. 1.3.
Таблица 1.3. Логические операторы Java
Оператор |
Название |
Пояснение |
& |
Логическое И |
Бинарный оператор. Результатом операции A&B явля- ется true, если значения обоих операндов равны true. В противном случае возвращается значение false |
&& |
Сокращенное логическое И |
Бинарный оператор. Особенность оператора, по срав- нению с оператором &, состоит в том, что если значе- ние первого операнда равно false, то значение второго операнда не проверяется |
| |
Логическое ИЛИ |
Бинарный оператор. Результатом операции A|B являет- ся true, если значение хотя бы одного операнда равно true. В противном случае возвращается значение false |
|| |
Сокращенное логическое ИЛИ |
Бинарный оператор. Особенность оператора, по срав- нению с оператором |, состоит в том, что если значе- ние первого операнда равно true, то значение второго операнда не проверяется |
^ |
Исключающее ИЛИ |
Бинарный оператор. Результатом операции A^B являет- ся true, если значение одного и только одного опе- ранда равно true. В противном случае возвращается значение false |
! |
Логическое отрицание |
Унарный оператор. Результатом команды !A является true, если значение операнда A равно false. Если зна- чение операнда A равно true, результатом команды !A является значение false |
Логические операторы обычно используются в качестве условий в условных операторах и операторах цикла.
В табл. 1.4 перечислены операторы сравнения, используемые в Java.
Таблица 1.4. Операторы сравнения Java
Оператор |
Название |
Пояснение |
== |
Равно |
Результатом операции A==B является значения true, если операнды A и B имеют одинаковые значения. В противном случае значением является false |
Оператор |
Название |
Пояснение |
< |
Меньше |
Результатом операции A<B является значения true, если значение операнда A меньше значения операнда B. В противном случае значением является false |
<= |
Меньше или равно |
Результатом операции A<=B является значения true, если значение операнда A не больше значения операн- да B. В противном случае значением является false |
> |
Больше |
Результатом операции A>B является значения true, если значение операнда A больше значения операнда B. В противном случае значением является false |
>= |
Больше или равно |
Результатом операции A>=B является значения true, если значение операнда A не меньше значения опе- ранда B. В противном случае значением является false |
!= |
Не равно |
Результатом операции A!=B является значения true, если операнды A и B имеют разные значения. В про- тивном случае значением является false |
Операторы сравнения обычно используются совместно с логическими операто- рами.
Для понимания принципов работы поразрядных операторов необходимо иметь хотя бы элементарные познания о двоичном представлении чисел. Напомним читателю некоторые основные моменты.
В двоичном представлении позиционная запись числа содержит нули и еди- ницы.
Старший бит (самый первый слева) определяет знак числа. Для положитель- ных чисел старший бит равен нулю, для отрицательных — единице.
Перевод из двоичной системы счисления положительного числа с позицион-
ной записью
bnbn1...b2b1b0
(bi могут принимать значения 0 или 1, старший
бит для положительных чисел bn = 0) в десятичную выполняется так:
0 1 2
n1 n
b0 2
b12
b2 2
... bn12
bn 2 .
Для перевода отрицательного двоичного числа в десятичное представление производится побитовое инвертирование кода (об операции побитового ин- вертирования — см. далее), полученное двоичное число переводится в деся- тичную систему, к нему прибавляется единица (и добавляется знак минус).
Для перевода отрицательного числа из десятичной в двоичную систему от модуля числа отнимают единицу, результат переводят в бинарный код и затем этот код инвертируют.
Умножение числа на два эквивалентно сдвигу влево на один бит позиционной записи числа (с заполнением первого бита нулем).
Побитовые операторы Java описаны в табл. 1.5.
Таблица 1.5. Побитовые операторы Java
Оператор |
Название |
Пояснение |
& |
Побитовое И |
Бинарный оператор. Логическая операция И приме- няется к каждой паре битов операндов. Результатом является 1, если каждый из двух сравниваемых битов равен 1. В противном случае результат равен 0 |
| |
Побитовое ИЛИ |
Бинарный оператор. Логическая операция ИЛИ при- меняется к каждой паре битов операндов. Результатом является 1, если хотя бы один из двух сравниваемых битов равен 1. В противном случае результат равен 0 |
^ |
Побитовое ИСКЛЮЧА- ЮЩЕЕ ИЛИ |
Бинарный оператор. Логическая операция ИСКЛЮЧАЮЩЕЕ ИЛИ применяется к каждой паре битов операндов. Результатом является 1, если один и только один из двух сравниваемых битов равен 1. В противном случае результат равен 0 |
~ |
Побитовое отрицание |
Унарный оператор. Выполняется инверсия двоичного кода: 0 меняется на 1, а 1 меняется на 0 |
>> |
Сдвиг вправо |
Бинарный оператор. Результатом является число, получаемое сдвигом вправо в позиционном пред- ставлении первого операнда (слева от оператора) на количество битов, определяемых вторым операндом (справа от оператора). Исходное значение перво- го операнда при этом не меняется. Младшие биты теряются, а старшие заполняются дублированием знакового бита |
<< |
Сдвиг влево |
Бинарный оператор. Результатом является число, получаемое сдвигом влево в позиционном представле- нии первого операнда (слева от оператора) на количе- ство битов, определяемых вторым операндом (справа от оператора). Исходное значение первого операнда при этом не меняется. Младшие биты заполняются нулями, а старшие теряются |
>>> |
Беззнаковый сдвиг вправо |
Бинарный оператор. Результатом является число, по- лучаемое сдвигом вправо в позиционном представле- нии первого операнда (слева от оператора) на количе- ство битов, определяемых вторым операндом (справа от оператора). Исходное значение первого операнда при этом не меняется. Младшие биты теряются, а старшие заполняются нулями |
&= |
Упрощенная форма побито- вого оператора & с присваиванием |
Команда вида A&=B является эквивалентом команды A=A&B |
|= |
Упрощенная форма побито- вого оператора | с присваиванием |
Команда вида A|=B является эквивалентом команды A=A|B |
Оператор |
Название |
Пояснение |
^= |
Упрощенная |
Команда вида A^=B является эквивалентом команды |
форма побито- |
||
вого оператора ^ |
A=A^B |
|
с присваиванием |
||
>>= |
Упрощенная |
Команда вида A>>=B является эквивалентом команды |
форма побитово- |
||
го оператора >> |
A=A>>B |
|
с присваиванием |
||
<<= |
Упрощенная |
Команда вида A<<=B является эквивалентом команды |
форма побитово- |
||
го оператора << |
A=A<<B |
|
с присваиванием |
||
>>>= |
Упрощенная |
Команда вида A>>>=B является эквивалентом команды |
форма побитово- |
||
го оператора >>> |
A=A>>>B |
|
с присваиванием |
За редким исключением, побитовые операции используются в случаях, когда необходимо оптимизировать программу в отношении быстродействия.
Помимо перечисленных операторов, в Java есть единственный тернарный опе- ратор (у оператора три операнда). Формально оператор обозначается как ?:. Синтаксис вызова этого оператора следующий:
условие?значение_1:значение_2
Первым операндом указывается условие — выражение, возвращающее в качестве значения логическое значение. Если значение выражения-условия равно true, в качестве значения тернарным оператором возвращается значение_1. Если зна- чением выражения-условия является false, тернарным оператором в качестве значения возвращается значение_2.
Несколько замечаний по поводу оператора присваивания (оператор =). В Java оператор присваивания возвращает значение. Команда вида x=y выполняется следующим образом. Сначала вычисляется выражение y, после чего это выра- жение приводится к типу переменной x и затем записывается в эту переменную. Благодаря тому, что, в отличие от других операторов с равными приоритетами, присваивание выполняется справа налево, в Java допустимыми являются ко- манды вида x=y=z. В этом случае значение переменной z присваивается сначала переменной y, а затем значение переменной y присваивается переменной x.
Еще одно замечание касается упрощенных форм операторов с присваиванием, то есть операторов вида op=. Хотя утверждалось, что команда вида A op=B эк- вивалента команде A=A op B, это не совсем так. При выполнении команды вида A op=B сначала вычисляется выражение A op B, затем полученное значение при- водится к типу переменной A и только после этого присваивается переменной A. Поскольку приведение к типу переменной A выполняется, фактически, явно, а в команде A=A op B приведение типов неявное, может проявиться разница
в использовании полной и упрощенной форм команд присваивания. Рассмо- трим простой пример:
byte a=10,b=20;
// Правильно: a+=20;
// Неправильно: a=a+b;
В данном случае команда a+=20 является корректной, а команда a=a+b — нет. В первом случае литерал 20 типа int «насильственно» приводится к типу byte в силу особенностей оператора +=. Во втором случае результат вычисления вы- ражения a+b автоматически расширяется до типа int, а автоматическое приведе- ние типа int к типу byte запрещено.
Напоследок приведем в табл. 1.6 данные о приоритете различных операторов в Java.
Таблица 1.6. Приоритеты операторов в Java
Приоритет |
Операторы |
1 |
Круглые скобки ( ), квадратные скобки [ ] и оператор «точка» |
2 |
Инкремент ++, декремент --, отрицания ~ и ! |
3 |
Умножение *, деление / и вычисление остатка % |
4 |
Сложение + и вычитание - |
5 |
Побитовые сдвиги >>, << и >>> |
6 |
Больше >, больше или равно >=, меньше или равно <= и меньше < |
7 |
Равно == и неравно != |
8 |
Побитовое И & |
9 |
Побитовое исключающее ИЛИ ^ |
10 |
Побитовое ИЛИ | |
11 |
Логическое И && |
12 |
Логические ИЛИ || |
13 |
Тернарный оператор ?: |
14 |
Присваивание = и сокращенные формы операторов вида op= |
Операторы равных приоритетов (за исключением присваивания) выполняются слева направо. В случаях когда возникают сомнения в приоритете операторов и последовательности вычисления выражений, рекомендуется использовать круглые скобки.
