Главная » Java, Структуры данных и алгоритмы » Выражения Java

0

Из переменных и констант составляются выражения, используемые для описания и изменения переменных. В данном разделе более подробно остановимся на вычислении выражений в Java. Выражения состоят из констант, переменных и операций. Выше переменные уже были рассмотрены, поэтому в данном разделе остановимся подробнее на литеральных константах и операциях.

Константы

Константа является «постоянным» значением, которое может быть использовано в выражениях присвоения и других выражениях. В Java существуют следующие виды литеральных констант:

•                            объектная ссылка null (единственная константа ссылочного типа, описана в классе Object);

•               логические (boolean): true или false;

•                            целые: по умолчанию целые числа 176 или -52 имеют тип int, которому выделяется четыре байта. В конце длинных целых констант необходимо указывать букву «L» или «1», например, 176L или -521 обозначают целый тип, занимающий восемь байт;

•                            константы с плавающей точкой (вещественные константы) — по умолчанию константы с плавающей точкой, такие как 3.1415 и 10035.23, хранятся в формате double. Чтобы сохранить константу в формате float, необходимо записать ее с символами «F» или «f» в конце. Константы могут иметь экспоненциальное представление, например 3.14Е2 или .19е10. Подобные константы записываются только в десятичной системе счисления;

•                            символы: Java использует символы в кодировке Unicode. Одиночные символы записываются в апострофах, например: ‘а’ или ‘?’. Кроме того, в Java используются следующие управляющие символьные константы:

‘\n’

символ перевода строки

‘V

символ горизонтальной табуляции

‘\b’

символ возврата на шаг

‘У’

символ возврата каретки

‘\f

римвол перевода страницы

 

обратная наклонная черта

‘V’

апостроф

‘V’

кавычка

• строки: строка является последовательностью символов, заключенных в кавычки, например, «dog all around» или «jump».

Операции

Выражения состоят из переменных, констант и операций. Рассмотрим встроенные в Java операции.

Операции присваивания

В операциях присваивания в Java используется знак равенства «=». Данный оператор присваивает некоторое значение переменной объекта или локальной переменной. Например:

<variable> = <expression>

К переменной <variable> может относиться блок операторов, содержащий выражение <expression>. В результате операции присваивания переменная получает значение выражения. Таким образом, если при объявлении i и j указан тип int, операция присваивания может быть записана следующим образом:

i = j = 25, Точечная операция

Как было упомянуто выше, для создания нового объекта в Java используется оператор new, который предназначен для выделения памяти объекту, после чего для инициализации этого объекта запускается конструктор. В результате адрес (местоположение) данной ячейки памяти присваивается переменной типа ссылка. Таким образом, переменная-ссылка выступает в качестве связующего звена или указателя на определенный объект. Каждая переменная-ссылка должна указывать на некоторый объект, даже если объект является пустым. Может существовать несколько ссылок на один и тот же объект, и каждая ссылка на объект может быть использована для обращения к методу этого объекта.

Переменная-ссылка служит главным образом для обеспечения доступа к членам класса объекта, то есть она позволяет обращаться к методам и полям объекта. Данное обращение осуществляется с помощью операции, обозначаемой знаком точка «.». Вызов метода, связанного с объектом, выглядит следующим образом:

I

<object_reference>. <method_name>([<param>,<param>, . ]),

В результате для объекта, на который объявляется ссылка, вызывается метод с указанным именем. Дополнительно можно передать несколько параметров. Если для указанного объекта существует несколько методов с одинаковым именем объекта, то управляющая Java-система выбирает один из них, наилучшим образом соответствующий объекту по числу и типу параметров. Имя метода, а также число и тип параметров образуют сигнатуру метода, и именно сигнатура определяет, какой из существующих методов будет выполнен при данном обращении. Например:

oven cookDinner();

oven.cookDinner(food);

oven.cookDinner(food, seasoning);

В действительности каждое из этих обращений относится к различным методам с одинаковым именем, описанным в классе, которому принадлежит oven. Следует отметить, что сигнатура метода не содержит типа возвращаемого методом значения, таким образом, в Java невозможен возврат различных типов методами с одинаковой сигнатурой.

Обращение к переменной экземпляра класса, связанной с объектом, происходит с помощью операции, обозначаемой знаком «.»:

<object_reference>.<variable_name>

Если область видимости переменной разрешает доступ к ней, то данная запись может находиться в любой части выражения. Тем не менее имя переменной <variable_name> должно принадлежать объекту, на который ссылается <object_reference>.

Если ссылка на объект не имеет тип final, то она может находиться в левой части оператора присваивания. Например:

gnome.name = "Professor Smythe";

gnome.age == 132;

Ссылка на объект <object_reference> может быть выражением, возвращающим ссылку на объект, то есть можно записать:

Gnome g = new GnomeQ;

String buddyName = (g gnome_buddy).name;

Арифметические операции

К арифметическим операциям в Java относятся:

+                                                сложение

—                                              вычитание

*                                                умножение

/                                                 деление

%                                               деление по модулю

Все операции, кроме последней, вполне очевидны. Деление по модулю называют еще «остатком от деления», так как в результате этой операции определяется остаток от деления целых чисел. Для обозначения оператора деления по модулю используется слово «mod», и формально его можно описать следующим образом:

п mod т = п – \_п / mjm.

В Java также применяется знак «-», задаваемый перед арифметическим выражением для изменения его знака. В выражении могут использоваться скобки, которые устанавливают порядок вычислений. Кроме того, существует приоритет операторов, то есть правила, определяющие

порядок вычислений при отсутствии скобок. В отличие от С++, в Java невозможна перегрузка[3] операторов этого типа.

Инкремент и декремент

Как и в языках С и С++, в Java встроены операции инкремента и декремента, то есть операции увеличения (++) и уменьшения (—) значения переменной на единицу соответственно. Если такая операция указана перед переменной, то вначале к значению переменной прибавляется (или вычитается) единица, а затем новое значение участвует в выражении. Если же знак операции указан после переменной, то в выражении участвует старое значение, и только потом происходит увеличение или уменьшение значения переменной. В качестве примера рассмотрим следующий фрагмент кода:

int i = 8;

int j = i++; int k = ++i;

int m = i—————— ,

int n = i++ +——————— i;

j получает значение 8, hw становятся равными 10, значение п равно 18, а / принимает значение 9.

Логические операции

В Java встроены следующие стандартные операции сравнения чисел:

< меньше <= меньше или равно’ == равно != не равно >= больше или равно > больше

Операции == или != могут использоваться и для сравнения ссылок. Результат сравнения — логическое значение типа boolean.

Над логическими данными выполняются следующие операции:

!                                                отрицание (префикс)

&& конъюнкция (оператор И) 11 дизъюнкция (оператор ИЛИ)

Правый операнд сокращенных операций конъюнкции и дизъюнкции вычисляется только в том случае, если от него зависит значений выражения. Это правило удобно для записи логических выражений, где вначале проверяется соблюдение определенного условия (например, ссцлка не равна null), после чего анализируется условие, которое в противном случае могло привести к ошибке, если первая проверка не была выполнена.

Побитовые операции

В Java существуют следующие побитовые операции для работы с целыми и логическими данными:

побитовое дополнение (унарный оператор) (префикс) & побитовая конъюнкция |           побитовая дизъюнкция

А побитовое исключающее ИЛИ

<< сдвиг влево, освободившиеся справа биты заполняются нулями

>> сдвиг вправо, освободившиеся слева биты заполняются единицами

»> беззнаковый сдвиг вправо, освободившиеся слева биты заполняются нулями

Прочие операции присваивания

Кроме обычной операции присваивания (=), в Java существуют и другие операции, обладающие дополнительными побочными свойствами. Форма записи для операций данного вида следующая:

<variable> <ор> = <expression>;

что равнозначно

<variable^> = <variable> <ор> < expression >;

За исключением случаев, когда <variable> содержит выражение (например, индекс массива), значение выражения вычисляется только один раз. В представленном ниже фрагменте кода

а [5] = 10; i = 5,

a [i++] + = 2;

а [5] получает значение 12, a i становится равным 6.

Сцепление (конкатенация) строк

Объединение строк можно производить с помощью операции конкатенации (сцепленйя строк), обозначаемой знаком «+». Таким образом, в результате обработки кода

String rug = "carpet";

String dog = "spot";

String mess = rug + dog;

String answer = mess + "will cost me dollars!"

- будет получена следующая строка "carpetspot cost me dollars!"

Данный пример демонстрирует возможность преобразования нестро- ковых констант в строки, если они участвуют в операции сцепления.

Приоритет операций

В Java существует правило приоритета операций, которое определяет последовательность выполнения операций при отсутствии скобок.

В табл. 1.3 представлен приоритет операций в Java (кстати, аналогичен приоритету операций в языке С).

Большинство операций, ^перечисленных в табл. 1.3, уже рассмотрено, за исключением условной операции, которая выполняется следующим образом. Вначале вычисляется логическое выражение, а затем, в зависимости от его результата (true или false), вычисляется одно из выражений после вопросительного знака (использование оператора instahceof будет рассмотрено в следующей главе).

Приоритет операций

 

Тип

Символы

1

постфиксные операции префиксные операции приведение типа

<ехр>++ <ехр>—

++<ехр> —<ехр> +<ехр> -<ехр> <ехр> кехр> (<type>)<exp>

2

умножение, деление

* / %

3

сложение, вычитание

+ -

. 4

сдвиг

< > »

5

сравнение"

<<=>>= instanceof

6

равенство

= = i=

7

побитовая конъюнкция

*

Приоритет операций

 

 

Тип

Символы

 

8

побитовое исключающее ИЛИ

л

 

9

побитовая дизъюнкция

1

 

10

конъюнкция

&&

 

11

дизъюнкция

11

 

12

условная операция

<bool_exp>? <true_val>- <false_val>

 

13

операция присваивания

= += -+ *= /= %= >= <= »=&= л= 1=

 

Таблица 1.3. Правило приоритета операций в Java. Операции в Java выполняются в соответствии с указанным порядком, если последний,не установлен скобками. Операции, расположенные в одной строке, выполняются слева направо (за исключением операций присваивания и префиксных операций, которые выполняются справа налево) по правилу вычисления логических операций and и or. Операции в таблице перечислены в порядке убывания приоритета (<ехр> обозначает выражение со скобками или без них). Если в выражении нет скобок, вначале выполняются операции с более; высоким приоритетом

Источник: Гудрич М.Т. Г93 Структуры данных и алгоритмы в Java / М.Т. Гудрич, Р. Тамассия; Пер. с англ. A.M. Чернухо. — Мн.: Новое знание, 2003. — 671 е.: ил.

По теме:

  • Комментарии