1. Booleske operationer

Operatorerne |og &kan anvendes ikke kun på tal, men også på booleske udtryk.

Men som du allerede ved, er der &&og ||operatører. Hvorfor skulle vi bruge |i stedet for ||og &i stedet for &&? Er der nogen mening med dette? Det ser ud til, at der er. Sommetider.

De logiske operatorer udføres fra venstre mod højre efter et såkaldt lazy ||- princip .&&

(expression1) || (expression2) || (expression3)

Hvis expression1 er lig med true, er der ingen mening i at evaluere expression2 og expression3: resultatet vil være trueuanset.

Følgelig, når vi evaluerer udtryk (de evalueres fra venstre mod højre), så snart vi får true, springes evalueringen af ​​resten af ​​udtrykkene over . Og hvis expression2 og expression3inkluderer metodekald, vil disse metoder ikke blive kaldt !

Det samme gælder for den &&logiske operator:

(expression1) && (expression2) && (expression3)

Hvis expression1er lig med false, er der ingen mening i at evaluere expression2og expression3: resultatet vil være falseuanset.

Dette er et vigtigt faktum, der lader dig skrive ting som:

String s = null;
if (s != null && s.length() > 0) {

Eksemplet ovenfor vil aldrig give dig en NullPointerException , fordi s.length()den kun vil blive udført, hvis den første del s! = nuller true.

Hvis ser lig med , er nulldelen til venstre for operatoren , så er resultatet af hele det booleske udtryk , så delen til højre ( ) evalueres ikke.&&falsefalses.length() > 0

Alt det at sige:

Hvis du bruger operatoren |eller &operatoren, er der ingen doven evaluering : hvert underudtryk vil altid blive evalueret.



2. Operationsprioritet i Java

Som du sikkert husker fra din matematiktime på gymnasiet, har multiplikationsoperatoren højere forrang end additionsoperatoren. Parenteser har en endnu højere forrang: Udtryk i parentes evalueres først, derefter multiplikation og division, og derefter addition og subtraktion.

Operatører i Java har også en rækkefølge. Forskellen er, at a) der er lidt flere af dem, b) for nogle operatorer evalueres operanderne fra venstre mod højre, mens for andre - fra højre mod venstre.

Her er en tabel med alle Java-operatorerne:

Kategori Operatør Associativ
Postfix () [] . Fra venstre mod højre
Unær ++ -- ! ~ Højre til venstre
Multiplikativ * / % Fra venstre mod højre
Tilsætningsstof + - Fra venstre mod højre
Skifter >> >>> << Fra venstre mod højre
Relationel > >= < <= Fra venstre mod højre
Lighed == != Fra venstre mod højre
BitvisAND & Fra venstre mod højre
Exclusive OR(XOR) ^ Fra venstre mod højre
BitvisOR | Fra venstre mod højre
LogiskAND && Fra venstre mod højre
LogiskOR || Fra venstre mod højre
Betinget ?: Højre til venstre
Opgave = += -= *= /= %= >>= <<= &= ^= |= Højre til venstre
Komma , Fra venstre mod højre

Den øverste linje indeholder de operatorer med den højeste prioritet. Parenteser ()bruges til eksplicit at angive prioritet. Firkantede parenteser []bruges til at få adgang til et element ved et specifikt indeks for en matrixvariabel. Punktoperatoren ( .) bruges til at få adgang til felter og metoder ved hjælp af en reference til et objekt eller en klasse.

Jo lavere operatørerne er i tabellen, jo lavere er deres forrang.

Hvis du bruger flere operatorer i et udtryk, skal du ikke være doven: Tilføj parenteser.

I Java kan du skrive noget som if (a & 1<< b > ~c), men det skal du ikke. Du skriver kode ikke kun til compileren, men også til andre programmører. Jo mere læsbar koden er, jo bedre.



3. Forøgelse af præfiks og postfiks

Som du allerede ved, har Java en inkrementoperator ( ++) og en decrementoperator ( --). De øger og mindsker værdien af ​​en variabel med 1.

Hvad du sikkert ikke ved er, at der er to typer af disse operatorer: præfiks (operatoren er placeret før variablen) og postfix (operatoren er placeret efter variablen). Og to slags operatører fungerer lidt forskelligt.

I Java kan du skrive et udtryk som dette:

int a = 5;
int b = a++;

Hvis ++operatoren vises efter en variabel, og variablen er en del af et udtryk (som i eksemplet ovenfor), så vil udtrykket bruge den aktuelle værdi af variablen, og først bagefter vil variablen blive forøget med 1.

Med andre ord vil noget som dette ske:

int a = 5;
int b = a;
a = a + 1;

Det vil sige, bvil være 5, ikke 6som du måske tror ved første øjekast.

Hvis ++operatoren er før variablen, og variablen er en del af et udtryk, vil den først blive forøget med, 1og først bagefter vil dens værdi blive brugt i udtrykket.

int a = 5;
int b = ++a;

Eksemplet ovenfor svarer til følgende eksempel:

int a = 5;
a = a + 1;
int b = a;

Her bvil være lig med 6.

Der er endda et eksempel, der bruges af Java-programmører til at afgøre, om en anden også er Java-programmør:

int a = 5;
int b = ++a + ++a;

Ja, det kan du også skrive.

Dette eksempel vil kompilere fint og blive til noget som dette:

int a = 5;

a = a + 1;
int v1 = a;

a = a + 1;
int v2 = a;

int b = v1 + v2;

For --operatøren er alt præcis det samme.