1. Выражения vs Команды

Все команды в Java делятся на две категории: команды (Statement) и выражения (Expression). Про команду обычно говорят, что она выполняется, а про выражение — что оно вычисляется. Но это не главное.

Основное отличие между командой и выражением в том, что у выражения есть результат вычисления. И у этого результата, во-первых, есть тип, а во-вторых, этот результат можно куда-то присвоить, ну или использовать в каком-то другом выражении.

Примеры:

Код Примечания
int x; Команда
(a < 10) Выражение, тип boolean
i++; Выражение, тип совпадает с типом переменной i
x = 5; Выражение, тип совпадает с типом переменной x

И что это нам дает?

Во-первых, мы можем использовать тот факт, что очень много команд на самом деле являются выражением (имеют результат вычисления). Например, такой код будет работать:

Код Примечания
int x, y, z;
x = y = z = 1;
int x, y, z;
x = (y = (z = 1));

Во-вторых, мы можем игнорировать результат вычисления выражения, если хотим.

Код Код, где мы игнорируем результат:
int x = scanner.nextInt();
boolean m = (5 < 10);
scanner.nextInt();
(5 < 10);

Игнорировать результат вычисления выражения нужно, например, если выражение кроме результата делает еще что-то полезное, и нам это действие важно, а сам результат — нет.


2. Тернарный оператор

Этот лайфхак уже поинтереснее предыдущего. В Java есть специальный тернарный (тройной) оператор. Чем-то он похож на сокращенную запись оператора if–else:

Условие ? Выражение1 : Выражение2;

Если условие истинно, то выполняется выражение1 иначе выполняется выражение2. После условия следует знак вопроса, а два выражения разделены двоеточием.

Основное отличие тернарного оператора от оператора if-else в том, что тернарный оператор является выражением, а значит его результат можно чему-нибудь присвоить.

Например, мы хотим вычислить минимум двух чисел. С использованием тернарного оператора этот код будет выглядеть так:

int a = 2;
int b = 3;
int min = a < b ?  a : b;

Или, допустим, вам нужно присвоить переменной разные значения в зависимости от какого-то условия. Как это сделать?

Вариант первый — воспользоваться оператором if-else:

int age = 25;
int money;
if (age > 30)
   money = 100;
else
   money = 50;

Второй вариант — использовать тернарный оператор, то есть сокращенную запись оператора if-else:

int age = 25;
int money = age > 30 ? 100 : 50;

Так что же лучше использовать: оператор if-else или тернарный оператор? С точки зрения скорости выполнения, особой разницы нет. Здесь скорее вопрос читаемости кода. И это очень важный момент: код должен не только правильно работать, но и легко читаться другими программистами.

Самый простой критерий может быть таким: если код помещается в одну строку — используйте тернарный оператор, если в одну строку он уже не помещается — лучше использовать if-else.


undefined
3
Задача
Java Syntax PRO Comics, 3 уровень, 7 лекция
Недоступна
Подгоревший бифштекс
Дела шли совсем плохо, из-за багов вся еда сгорала в адском пламени. А Роботэсс носилась в истерике среди клубов черного дыма.
undefined
3
Задача
Java Syntax PRO Comics, 3 уровень, 7 лекция
Недоступна
Ищем максимум
У нас есть программа, которая считывает с клавиатуры два числа и выводит на экран большее из них. Если числа одинаковые, то выводится любое. Перепиши программу с использованием тернарного оператора, чтобы ее функционал остался без изменений.

3. Сравнение вещественных чисел

Как уже говорилось раньше, просто так сравнивать вещественные числа нельзя: в процессе работы с ними всегда могут возникать неожиданные эффекты из-за того, что часть значащих цифр отбрасывается.

Поэтому есть проверенный временем подход. Если два вещественных числа отличаются на очень маленькое значение, значит можно считать их равными. Пример:

double a = 1.000001;
double b = 1.000002;
if ( (b - a) < 0.0001 )
   System.out.println("Числа равны");
else
   System.out.println("Числа не равны");

Но это еще не все: разница чисел вполне может оказаться отрицательным числом. Поэтому, чтобы такой подход работал, нужно сравнивать не просто разницу чисел, а модуль разницы чисел: |a-b|

В Java есть специальный метод для вычисления модуля числа — Math.abs():

int m = Math.abs(значение);

Поэтому исправленный вариант нашего примера выше будет выглядеть вот так:

double a = 1.000001;
double b = 1.000002;

if ( Math.abs(b - a) < 0.0001 )
   System.out.println("Числа равны");
else
   System.out.println("Числа не равны");

undefined
3
Задача
Java Syntax PRO Comics, 3 уровень, 7 лекция
Недоступна
Через тернии...
Эта программа написана с использованием тернарного оператора, но не совсем понятно, что она делает. Думаем, если избавиться от тернарного оператора, то станет намного понятнее. Перепиши программу без использования тернарного оператора.

undefined
3
Задача
Java Syntax PRO Comics, 3 уровень, 7 лекция
Недоступна
Высокая точность
Напиши программу, которая считывает с клавиатуры два вещественных числа (double) и выдает сообщение о том, равны ли эти числа с точностью до одной миллионной.