1. Boolske operasjoner

Operatorene |og &kan brukes ikke bare på tall, men også på boolske uttrykk.

Men, som du allerede vet, er det &&og ||operatører. Hvorfor skulle vi bruke |i stedet for ||, og &i stedet for &&? Er det noe poeng med dette? Det ser ut til at det er det. Noen ganger.

De logiske operatorene utføres fra venstre til høyre etter et såkalt lazy ||- prinsipp .&&

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

Hvis expression1 er lik true, er det ingen vits i å evaluere expression2 og expression3: resultatet blir trueuansett.

Følgelig, når du evaluerer uttrykk (de evalueres fra venstre til høyre), så snart vi får true, hoppes evalueringen av resten av uttrykkene over . Og hvis expression2 og expression3inkluderer metodekall, vil disse metodene ikke bli kalt !

Det samme gjelder for den &&logiske operatoren:

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

Hvis expression1er lik false, er det ingen vits i å evaluere expression2og expression3: resultatet blir falseuansett.

Dette er et viktig faktum som lar deg skrive ting som:

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

Eksemplet ovenfor vil aldri gi deg et NullPointerException , fordi s.length()det kun vil bli utført hvis den første delen s! = nuller true.

Hvis ser lik , er nulldelen til venstre for operatoren , så er resultatet av hele det boolske uttrykket , så delen til høyre ( ) blir ikke evaluert.&&falsefalses.length() > 0

Alt det å si:

Hvis du bruker operatøren |eller &operatøren, er det ingen lat evaluering : hvert underuttrykk vil alltid bli evaluert.



2. Operasjonsprioritet i Java

Som du sikkert husker fra matematikkklassen på videregående, har multiplikasjonsoperatoren høyere prioritet enn addisjonsoperatoren. Parenteser har en enda høyere prioritet: uttrykk i parentes evalueres først, deretter multiplikasjon og divisjon, og deretter addisjon og subtraksjon.

Operatører i Java har også en rekkefølge. Forskjellen er at a) det er litt flere av dem, b) for noen operatører blir operandene evaluert fra venstre til høyre, mens for andre - fra høyre til venstre.

Her er en tabell med alle Java-operatørene:

Kategori Operatør Assosiativ
Postfix () [] . Fra venstre til høyre
Unær ++ -- ! ~ Høyre til venstre
Multiplikativ * / % Fra venstre til høyre
Tilsetningsstoff + - Fra venstre til høyre
Skiftende >> >>> << Fra venstre til høyre
Relasjonell > >= < <= Fra venstre til høyre
Likestilling == != Fra venstre til høyre
BitvisAND & Fra venstre til høyre
Exclusive OR(XOR) ^ Fra venstre til høyre
BitvisOR | Fra venstre til høyre
LogiskAND && Fra venstre til høyre
LogiskOR || Fra venstre til høyre
Betinget ?: Høyre til venstre
Oppdrag = += -= *= /= %= >>= <<= &= ^= |= Høyre til venstre
Komma , Fra venstre til høyre

Den øverste linjen inneholder operatørene med høyest prioritet. Parenteser ()brukes til å angi prioritet eksplisitt. Firkantede parenteser []brukes for å få tilgang til et element ved en spesifikk indeks for en matrisevariabel. Punktoperatoren ( .) brukes for å få tilgang til felt og metoder ved å bruke en referanse til et objekt eller en klasse.

Jo lavere operatørene er i tabellen, jo lavere har de forrang.

Hvis du bruker flere operatorer i et uttrykk, ikke vær lat: legg til parenteser.

I Java kan du skrive noe sånt som if (a & 1<< b > ~c), men du bør ikke. Du skriver kode ikke bare for kompilatoren, men også for andre programmerere. Jo mer lesbar koden er, jo bedre.



3. Prefiks og postfiks inkrement

Som du allerede vet, har Java en inkrementoperator ( ++) og en dekrementoperator ( --). De øker og reduserer henholdsvis verdien av en variabel med 1.

Det du sannsynligvis ikke vet er at det finnes to typer av disse operatorene: prefiks (operatoren er plassert foran variabelen) og postfix (operatoren er plassert etter variabelen). Og to typer operatører fungerer litt forskjellig.

I Java kan du skrive et uttrykk som dette:

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

Hvis ++operatoren vises etter en variabel og variabelen er en del av et uttrykk (som i eksempelet ovenfor), vil uttrykket bruke gjeldende verdi av variabelen, og først etterpå vil variabelen økes med 1.

Med andre ord, noe slikt vil skje:

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

Det vil si, bvil være 5, ikke 6som du kanskje tror ved første øyekast.

Hvis ++operatoren er foran variabelen og variabelen er en del av et uttrykk, vil den først økes med 1og først etterpå vil verdien bli brukt i uttrykket.

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

Eksemplet ovenfor tilsvarer følgende eksempel:

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

Her bvil være lik 6.

Det er til og med et eksempel brukt av Java-programmerere for å finne ut om noen andre også er en Java-programmerer:

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

Ja, det kan du også skrive.

Dette eksemplet vil kompilere helt fint og bli til noe 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 nøyaktig det samme.