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 trueoavsett.

Följaktligen, vid utvĂ€rdering av uttryck (de utvĂ€rderas frĂ„n vĂ€nster till höger), sĂ„ snart vi fĂ„r , truehoppas utvĂ€rderingen av resten av uttrycken över . Och om expression2 och expression3inkluderar 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 expression2och expression3: resultatet blir falseoavsett.

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 nulldelen till vÀnster om operatorn , dÄ Àr resultatet av hela det booleska uttrycket , sÄ delen till höger ( ) utvÀrderas inte.&&falsefalses.length() > 0

Allt att sÀga:

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, bkommer att bli 5, inte 6som 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 1och 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 bkommer 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.