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 true
uansett.
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 expression3
inkluderer metodekall, vil disse metodene ikke bli kalt !
Det samme gjelder for den &&
logiske operatoren:
(expression1) && (expression2) && (expression3)
Hvis expression1
er lik false
, er det ingen vits i å evaluere expression2
og expression3
: resultatet blir false
uansett.
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! = null
er true
.
Hvis s
er lik , er null
delen til venstre for operatoren , så er resultatet av hele det boolske uttrykket , så delen til høyre ( ) blir ikke evaluert.&&
false
false
s.length() > 0
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, b
vil være 5
, ikke 6
som 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 1
og 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 b
vil 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.
GO TO FULL VERSION