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 true
uanset.
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 expression3
inkluderer metodekald, vil disse metoder ikke blive kaldt !
Det samme gælder for den &&
logiske operator:
(expression1) && (expression2) && (expression3)
Hvis expression1
er lig med false
, er der ingen mening i at evaluere expression2
og expression3
: resultatet vil være false
uanset.
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! = null
er true
.
Hvis s
er lig med , er null
delen til venstre for operatoren , så er resultatet af hele det booleske udtryk , så delen til højre ( ) evalueres ikke.&&
false
false
s.length() > 0
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, b
vil være 5
, ikke 6
som 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, 1
og 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 b
vil 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.
GO TO FULL VERSION