1. Uttryck vs påståenden

I Java är det bra att skilja mellan två kategorier: påståenden och uttryck . En sats sägs vanligtvis vara exekverad , medan ett uttryck sägs vara utvärderad . Men det är inte det viktigaste.

Den största skillnaden mellan ett påstående och ett uttryck är att utvärdering av ett uttryck har ett resultat . Och detta resultat har en typ, och det kan tilldelas en variabel eller användas i något annat uttryck.

Exempel:

Koda Anteckningar
int x; Påstående
(a < 10) Uttryck vars typ ärboolean
i++; Uttryck vars typ är densamma som variabelns ityp
x = 5; Uttryck vars typ är densamma som variabelns xtyp

Och vad ger detta oss?

För det första kan vi dra fördel av det faktum att många påståenden faktiskt är uttryck (vilket betyder att de värderas till ett värde). Till exempel kommer kod som denna att fungera:

Koda Anteckningar
int x, y, z;
x = y = z = 1;
int x, y, z;
x = (y = (z = 1))

För det andra, om vi vill, kan vi ignorera resultatet av att utvärdera ett uttryck.

Koda Kod där vi ignorerar resultatet:
int x = scanner.nextInt();
boolean m = (5 < 10);
scanner.nextInt();
(5 < 10);

Vi ignorerar resultatet av att utvärdera ett uttryck, till exempel om uttrycket innebär att göra något användbart, och denna åtgärd är det som är viktigt för oss, inte själva resultatet.


2. Ternär operatör

Detta life hack är redan mer intressant än det föregående. Java har en speciell ternär operatör . Dess syntax liknar syntaxen för uttalandet if-else:

Condition ? Expression 1 : Expression 2;

Om villkoret är sant, utvärderas uttryck 1 , annars utvärderas uttryck 2 . Villkoret följs av ett frågetecken och de två uttrycken separeras med kolon .

Huvudskillnaden mellan den ternära operatorn och ett if-elsepåstående är att den ternära operatorn är ett uttryck, vilket betyder att vi kan tilldela dess resultat till något.

Anta till exempel att vi vill beräkna minimum av två tal. Med den ternära operatorn skulle den här koden se ut så här:

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

Eller låt oss säga att du måste tilldela olika värden till en variabel beroende på något tillstånd. Hur gör man det?

Ett alternativ är att använda ett if-elseuttalande:

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

Det andra alternativet är att använda den ternära operatorn , det vill säga en förkortning för if-elseuttalandet:

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

Så vilket är bättre att använda - ett if-elseuttalande eller den ternära operatorn ? När det gäller exekveringshastighet är det inte så stor skillnad. Det här är mer en fråga om kodläsbarhet. Och detta är en mycket viktig punkt: koden måste inte bara fungera korrekt, utan också vara lätt att läsa för andra programmerare.

Den enklaste regeln är denna: om koden passar på en rad , använd den ternära operatorn ; men om det inte passar på en rad är det bättre att använda ett if-elseuttalande.



3. Jämföra reella tal

Som nämnts tidigare kan du inte bara ta reella siffror och jämföra dem. Det finns alltid möjligheten att vissa betydande siffror kan kasseras, vilket orsakar oväntade biverkningar.

Det är därför det finns ett beprövat tillvägagångssätt. Om två reella tal skiljer sig åt med ett mycket litet värde, kan de anses vara lika. Exempel:

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");

Men det är inte allt vi behöver oroa oss för, eftersom skillnaden mellan siffrorna mycket väl kan visa sig vara negativ. Så för att detta tillvägagångssätt ska fungera måste du inte bara jämföra skillnaden mellan siffrorna, utan det absoluta värdet av skillnaden mellan siffrorna:|a-b|

Java har en metod för att beräkna det absoluta värdet av ett tal: Math.abs():

int m = Math.abs(value);

Som ett resultat kommer den korrigerade versionen av vårt exempel ovan att se ut så här:

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");