1. Вирази й команди

Усі команди в 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.


4
Задача
Модуль 1. Java Syntax,  6 рівень1 лекція
Недоступна
Показуємо, що отримуємо
Вводимо дані з клавіатури й одразу виводимо їх на екран, доки не буде введено слово "enough". Слово "enough" виводити не потрібно. Для цього потрібно використовувати нескінченний цикл (while(true)). Підказка: щоб завершити нескінченний цикл, використай оператор break.
4
Задача
Модуль 1. Java Syntax,  6 рівень1 лекція
Недоступна
Сума чисел, не кратних 3
Вивести на екран суму чисел від1 до 100 включно, які не кратні 3. Використай для цього цикл while. Підказка: для переходу в циклі до наступного числа використовуй оператор continue.

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("Числа не рівні");