Выражение в языке программирования — это, фактически, запись формулы в соответствии с правилами языка. Каждое выражение имеет тип, который получает значение, являющееся результатом вычисления выражения.
Арифметические выражения
Выражения в Java строятся по обычным правилам записи алгебраических формул. Для числовых типов используются обычные арифметические операторы: +, -, *, /, % с обычным приоритетом. Бинарная операция % дает остаток от деления. Деление целых чисел в Java дает целое число, поэтому результатом деления 4/3 будет 1, а результатом деления 3/4 будет 0. Если в бинарной операции один из операндов вещественный, а другой целый, то результат тоже будет вещественный. При этом целое число будет автомати-
чески, неявно преобразовываться к представлению вещественного числа. Такое преобразование форматов называется (неявной) конверсией типов. Конверсия типов называется также приведением или кастингом (от английского термина casting, обозначающего эту операцию).
Пусть в результате деления двух целых чисел index и 2 нужно получить вещественное число. При выполнении операции присваивания:
r.ean = index/2;
если mean — вещественная, a index — целая переменная, произойдет неявная конверсия типов: сначала будет получен целый результат деления двух целых чисел, после чего он будет конвертирован в вещественный тип при выполнении операции присваивания. Часто это совсем не то, что предполагает разработчик: ведь (double) (3/2) будет 1.0, а не 1.5. Выполнение деления вещественных чисел в этой задаче можно сделать несколькими способами. Самый простой вариант:
mean = index/2.;
Здесь константа 2 сразу представлена как вещественная. Для того чтобы выполнилось деление вещественных чисел при делении двух целых, необходимо выполнить явную конверсию типов хотя бы одного из операндов, например:
mеаn = (double)index/2;
Операция кастинга более приоритетна, чем арифметические операции, поэтому в данном примере сначала значение целой переменной index будет приведено к типу double. После этого будет выполняться операция деления, но для ее выполнения сначала будет выполнена неявная конверсия целого значения 2 к тому же типу double.
Булевские и условные выражения
Выражения булевского типа могут строиться из булевских переменных и констант, соединенных обычными операциями булевой алгебры && для И, || для ИЛИ и! для НЕ. Операции отношения: ==,!=, >,<,>=,<=
тоже порождают результат булевского типа. Например, результатом выражения:
(2==6)
будет false, а результатом выражения
(5!= 6)
будет true. Частой ошибкой начинающих программистов является использование вместо знака отношения == операции присваивания =.
Условное выражение имеет вид:
<условие>? <выражение1>: <выражение2>
Результатом условного выражения является выражение1, если значение условия истинно, и выражение2, если значение условия ложно. Например стоимость телефонного разговора с повременной тарификацией после первой минуты может быть вычислена с помощью условного выражения так:
t<=l? minPrice: t*minPrice
если t — время разговора в минутах, a minPrice — стоимость одной минуты разговора.
Другие операции
Операции ++ (инкремент), -- (декремент), += (увеличение значения на и подобные им также допускаются в выражениях. Например, пусть нужнс вычислить среднее число обработанных заявок в единицу времени после окончания обработки очередной заявки. Для этого можно увеличить на единицу количество count обработанных заявок, после чего разделить это количество на время, прошедшее с момента начала обработки. Это можно записать так:
count = count + 1; N = count/getTime();
Более коротко это записывается с использованием операции инкремента:
COunt++;
N = count/getTime();
Но это же можно записать еще более кратко:
N = ++count/getTime();
В последней записи сначала значение count увеличивается на 1, а затем оно используется в выражении.
Другой пример. Пусть необходимо при каждом поступлении отброшенной необслуженной заявки увеличить сумму штрафа Penalties на величин) penaltyPerCall. Для этого можно выполнить оператор:
Penalties += penaltyPerCall;
Данная запись эквивалентна следующей:
Penalties = Penalties + penaltyPerCall;
Для комбинации нескольких операций в одном выражении используются, разные правила приоритета и ассоциативности. Например, обычные арифметические операции одного приоритета +и-, * и / и им подобные лево- ассоциативны:
a-b+c-d -= (((a-b)+c)-d),
в то время как операции =, ++, —, += и некоторые другие — правоассоциа- тивны, например,
a+=b+=c=d = (a+=(b+=(c=d)))
Эти операторы могут встречаться и в других конструкциях, например, в условном выражении:
(а++ == b)? b-- -d: ++f+l
Во всех случаях, если программист не уверен в порядке выполнения операций, он должен использовать круглые скобки.