1. Booleska operationer
Operatörerna |
och &
kan anvÀndas inte bara pÄ siffror utan Àven pÄ booleska uttryck.
Men, som du redan vet, det finns &&
och ||
operatörer. Varför skulle vi anvÀnda |
istÀllet för ||
och &
istÀllet för &&
? Finns det nÄgon mening med detta? Det verkar som det finns. Ibland.
De logiska operatorerna exekveras frÄn vÀnster till höger enligt en sÄ kallad lazy-||
princip .&&
(expression1) || (expression2) || (expression3)
Om expression1
Ă€r lika med true
, Àr det ingen idé att utvÀrdera expression2
och expression3
: resultatet blir true
oavsett.
Följaktligen, vid utvÀrdering av uttryck (de utvÀrderas frÄn vÀnster till höger), sÄ snart vi fÄr , true
hoppas utvÀrderingen av resten av uttrycken över . Och om expression2
och expression3
inkluderar metodanrop kommer dessa metoder inte att kallas !
Detsamma gÀller för den &&
logiska operatorn:
(expression1) && (expression2) && (expression3)
Om expression1
Ă€r lika med false
, Àr det ingen idé att utvÀrdera expression2
och expression3
: resultatet blir false
oavsett.
Detta Àr ett viktigt faktum som lÄter dig skriva saker som:
String s = null;
if (s != null && s.length() > 0) {
Exemplet ovan kommer aldrig att ge dig ett NullPointerException , eftersom s.length()
det bara kommer att köras om den första delen s! = null
Ă€r true
.
Om s
Àr lika med , Àr null
delen till vÀnster om operatorn , dÄ Àr resultatet av hela det booleska uttrycket , sÄ delen till höger ( ) utvÀrderas inte.&&
false
false
s.length() > 0
Om du anvÀnder |
operatorn eller &
operatorn, sÄ finns det ingen lat utvÀrdering : varje underuttryck kommer alltid att utvÀrderas.
2. Operationsprioritet i Java
Som du sÀkert minns frÄn din matematikklass pÄ gymnasiet har multiplikationsoperatorn högre företrÀde Àn additionsoperatorn. Parenteser har en Ànnu högre prioritet: uttryck inom parentes utvÀrderas först, sedan multiplikation och division, och sedan addition och subtraktion.
Operatörer i Java har ocksÄ en prioritetsordning. Skillnaden Àr att a) det finns nÄgot fler av dem, b) för vissa operatörer utvÀrderas operanderna frÄn vÀnster till höger, medan för andra - frÄn höger till vÀnster.
HÀr Àr en tabell med alla Java-operatorer:
Kategori | Operatör | Associativ |
---|---|---|
Postfix | () [] . |
FrÄn vÀnster till höger |
Unary | ++ -- ! ~ |
Höger till vÀnster |
Multiplikativ | * / % |
FrÄn vÀnster till höger |
Tillsats | + - |
FrÄn vÀnster till höger |
Skiftande | >> >>> << |
FrÄn vÀnster till höger |
Relationellt | > >= < <= |
FrÄn vÀnster till höger |
JĂ€mlikhet | == != |
FrÄn vÀnster till höger |
BitvisAND |
& |
FrÄn vÀnster till höger |
Exclusive OR (XOR) |
^ |
FrÄn vÀnster till höger |
BitvisOR |
| |
FrÄn vÀnster till höger |
LogiskAND |
&& |
FrÄn vÀnster till höger |
LogiskOR |
|| |
FrÄn vÀnster till höger |
Villkorlig | ?: |
Höger till vÀnster |
Uppdrag | = += -= *= /= %= >>= <<= &= ^= |= |
Höger till vÀnster |
Kommatecken | , |
FrÄn vÀnster till höger |
Den översta raden innehÄller de operatorer som har högst företrÀde. Parenteser ()
anvÀnds för att uttryckligen stÀlla in prioritet. Hakparenteser []
anvÀnds för att komma Ät ett element vid ett specifikt index för en matrisvariabel. Punktoperatorn ( .
) anvÀnds för att komma Ät fÀlt och metoder med hjÀlp av en referens till ett objekt eller en klass.
Ju lÀgre operatörerna Àr i tabellen, desto lÀgre har deras prioritet.
Om du anvÀnder flera operatorer i ett uttryck, var inte lat: lÀgg till parenteser.
I Java kan du skriva nÄgot som if (a & 1<< b > ~c)
, men du borde inte. Du skriver kod inte bara för kompilatorn utan Àven för andra programmerare. Ju mer lÀsbar koden Àr, desto bÀttre.
3. Prefix och postfix inkrement
Som du redan vet har Java en inkrementoperator ( ++
) och en dekrementoperator ( --
). De ökar respektive minskar vÀrdet pÄ en variabel med 1
.
Vad du förmodligen inte vet Àr att det finns tvÄ typer av dessa operatorer: prefix (operatorn placeras före variabeln) och postfix (operatorn placeras efter variabeln). Och tvÄ sorters operatörer fungerar lite olika.
I Java kan du skriva ett uttryck sÄ hÀr:
int a = 5;
int b = a++;
Om ++
operatorn visas efter en variabel och variabeln Àr en del av nÄgot uttryck (som i exemplet ovan), kommer uttrycket att anvÀnda det aktuella vÀrdet pÄ variabeln, och först efterÄt kommer variabeln att ökas med 1
.
Med andra ord, nÄgot sÄnt hÀr kommer att hÀnda:
int a = 5;
int b = a;
a = a + 1;
Det vill sÀga, b
kommer att bli 5
, inte 6
som du kanske tror vid första anblicken.
Om ++
operatorn Àr före variabeln och variabeln Àr en del av nÄgot uttryck, kommer den först att ökas med 1
och först dÀrefter kommer dess vÀrde att anvÀndas i uttrycket.
int a = 5;
int b = ++a;
Exemplet ovan motsvarar följande exempel:
int a = 5;
a = a + 1;
int b = a;
HĂ€r b
kommer att vara lika med 6
.
Det finns till och med ett exempel som anvÀnds av Java-programmerare för att avgöra om nÄgon annan ocksÄ Àr en Java-programmerare:
int a = 5;
int b = ++a + ++a;
Japp, det kan du ocksÄ skriva.
Det hÀr exemplet kommer att kompilera bra och förvandlas till nÄgot sÄ hÀr:
int a = 5;
a = a + 1;
int v1 = a;
a = a + 1;
int v2 = a;
int b = v1 + v2;
För --
operatören Àr allt exakt sig likt.
GO TO FULL VERSION