Блоки операторов часто применяются для ограничения области действия переменных, а иногда просто для улучшения читаемости текста программы.
Точка с запятой в конце любой операции присваивания превращает ее в оператор присваивания. Побочное действие операции — присваивание — становится в операторе основным.
Разница между операцией и оператором присваивания носит лишь теоретический характер. Присваивание чаще используется как оператор, а не как операция.
Условный оператор (if-then-else statement) предназначен для организации разветвлений в программе. На языке Java он записывается так:
if
и действует следующим образом. Сначала вычисляется логическое выражение
Условный оператор может быть сокращенным, без ветви else (if-then statement):
if
В том случае, когда
Синтаксис языка не позволяет записывать несколько операторов ни в ветви then, ни в ветви else. При необходимости составляется блок операторов в фигурных скобках. Соглашения "Code Conventions" рекомендуют всегда использовать фигурные скобки и размещать оператор на нескольких строках с отступами, как в следующем примере:
if (a < х){
х = a + b;
} else {
х = a — b;
}
Это облегчает добавление операторов в каждую ветвь при изменении алгоритма. Мы не будем строго следовать этому правилу, чтобы не увеличивать объем книги.
Очень часто одним из операторов является опять-таки условный оператор, например:
if (n == 0){ sign = 0;
} else if (n < 0){ sign = -1;
} else {
sign = 1;
}
При этом может возникнуть такая ситуация ("dangling else"):
int ind = 5, x = 100;
if (ind >= 10) if (ind <= 20) x = 0; else x = 1;
К какому условию if относится ветвь else, первому или второму? Сохранит переменная х значение 100 или станет равной 1? Здесь необходимо волевое решение, и общее для большинства языков, в том числе и Java, правило таково: ветвь else относится к ближайшему слева условию if, не имеющему своей ветви else. Поэтому в нашем примере переменная х останется равной 100.
Изменить этот порядок можно с помощью блока:
if (ind > 10) {if (ind < 20) х = 0;} else х = 1;
Вообще, не стоит увлекаться сложными вложенными условными операторами. Проверки условий занимают много времени. По возможности лучше использовать логические операции, например предыдущий условный оператор лучше записать так:
if (ind >= 10 && ind <= 20) х = 0; else х = 1;
В листинге 1.4 условный оператор применяется для вычисления корней квадратного уравнения
class QuadraticEquation{
public static void main(String[] args){
double a = 0.5, b = -2.7, c = 3.5, d, eps=1e-8; if (Math.abs(a) < eps) if (Math.abs(b) < eps)
if (Math.abs(c) < eps) // Все коэффициенты равны нулю
System.out.println("Решение — любое число");
else
System.out.println("Решений нет");
else
System.out.println(,,x1 = х2 = " +(-c / b)); else { // Коэффициенты не равны нулю
if((d = b*b — 4*a*c)< 0.0){ // Комплексные корни
d = 0.5 * Math.sqrt(-d) / a; a = -0.5 * b/ a;
System.out.println(,,x1 = " +a+ " +i " +d+", х2 = " +a+ " -i " +d);
} else { // Вещественные корни
d = 0.5 * Math.sqrt(d) / a; a = -0.5 * b / a;
System.out.println("х1 = " +(a + d)+ ", х2 = " +(a — d));
}
}
}
}
В этой программе использованы методы вычисления модуля abs() и вычисления квадратного корня sqrt () из вещественного числа, взятые из входящего в Java API класса Math. Поскольку все вычисления с вещественными числами производятся приближенно, не следует ожидать, что вещественное число будет точно равно нулю. Поэтому мы считаем, что коэффициент уравнения равен нулю, если его модуль меньше 0,00000001. Обратите внимание на то, как в методе println () используется сцепление строк, и на то, как операция присваивания при вычислении дискриминанта вложена в логическое выражение, записанное в условном операторе.