1. Wyrażenia a polecenia

Wszystkie polecenia w Javie są podzielone na dwie kategorie: polecenia ( Instrukcja ) i wyrażenia ( Wyrażenie ). Zwykle mówi się, że polecenie jest wykonywane , a wyrażenie jest oceniane . Ale nie o to chodzi.

Główna różnica między poleceniem a wyrażeniem polega na tym, że wyrażenie ma wynik oceny . A ten wynik, po pierwsze, ma typ, a po drugie, ten wynik można gdzieś przypisać, no cóż, lub użyć w jakimś innym wyrażeniu.

Przykłady:

Kod Notatki
int x; Zespół
(a < 10) Wyrażenie, typboolean
i++; Wyrażenie, typ jest taki sam jak typ zmienneji
x = 5; Wyrażenie, typ jest taki sam jak typ zmiennejx

A co nam to daje?

Po pierwsze, możemy wykorzystać fakt, że tak wiele poleceń jest w rzeczywistości wyrażeniami (mają wynik obliczenia). Na przykład ten kod będzie działał:

Kod Notatki
int x, y, z;
x = y = z = 1;
int x, y, z;
x = (y = (z = 1))

Po drugie, jeśli chcemy, możemy zignorować wynik oceny wyrażenia.

Kod Kod, w którym ignorujemy wynik:
int x = scanner.nextInt();
boolean m = (5 < 10);
scanner.nextInt();
(5 < 10);

Konieczne jest zignorowanie wyniku obliczenia wyrażenia, na przykład, jeśli wyrażenie oprócz wyniku robi coś jeszcze pożytecznego i ta czynność jest dla nas ważna, ale sam wynik nie.


2. Operator trójskładnikowy

Ten lifehack jest już bardziej interesujący niż poprzedni. Java ma specjalny trójskładnikowy (potrójny) operator . Pod pewnymi względami przypomina skróconą notację operatora if-else:

Condition ? Expression 1 : Expression 2;

Jeśli warunek jest spełniony, wówczas wykonywane jest wyrażenie1 , w przeciwnym razie wykonywane jest wyrażenie2 . Po warunku następuje znak zapytania , a dwa wyrażenia są oddzielone dwukropkiem .

Główna różnica między operatorem trójskładnikowym a operatorem if-elsepolega na tym, że operator trójskładnikowy jest wyrażeniem, co oznacza, że ​​jego wynik można do czegoś przypisać.

Na przykład chcemy obliczyć minimum dwóch liczb. Używając operatora trójskładnikowego, ten kod wyglądałby tak:

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

Lub powiedzmy, że musisz przypisać różne wartości do zmiennej w zależności od jakiegoś warunku. Jak to zrobić?

Pierwszą opcją jest użycie operatora if-else:

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

Drugą opcją jest użycie operatora trójskładnikowego , czyli skróconej notacji operatora if-else:

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

Którego więc lepiej użyć: operatora if-elseczy operatora trójskładnikowego ? Pod względem szybkości wykonania nie ma dużej różnicy. To bardziej kwestia czytelności kodu. I to jest bardzo ważny punkt: kod powinien nie tylko działać poprawnie, ale także być czytelny dla innych programistów.

Najprostszym kryterium może być to: jeśli kod mieści się w jednej linii - użyj operatora trójskładnikowego , jeśli nie mieści się już w jednej linii - lepiej użyć if-else.



3. Porównanie liczb rzeczywistych

Jak wspomniano wcześniej, nie można po prostu porównywać liczb rzeczywistych: podczas pracy z nimi zawsze mogą wystąpić nieoczekiwane efekty, ponieważ niektóre cyfry znaczące są odrzucane.

Dlatego istnieje sprawdzone podejście. Jeśli dwie liczby rzeczywiste różnią się o bardzo małą wartość, można je uznać za równe. Przykład:

double a = 1.000001;
double b = 1.000002;
if ( (b - a) < 0.0001 )
   System.out.println("The numbers are equal");
else
   System.out.println("The numbers are not equal");

Ale to nie wszystko: różnica liczb może równie dobrze okazać się liczbą ujemną. Dlatego, aby to podejście zadziałało, musisz porównać nie tylko różnicę liczb, ale także moduł różnicy liczb:|a-b|

Java ma specjalną metodę obliczania modułu liczby - Math.abs():

int m = Math.abs(value);

Tak więc poprawiona wersja naszego powyższego przykładu wyglądałaby tak:

double a = 1.000001;
double b = 1.000002;

if ( Math.abs(b - a) < 0.0001 )
   System.out.println("The numbers are equal");
else
   System.out.println("The numbers are not equal");