1. Booleaanse bewerkingen

De operatoren |and &kunnen niet alleen op getallen worden toegepast, maar ook op booleaanse uitdrukkingen.

Maar zoals u al weet, zijn er &&en ||operators. Waarom zouden we gebruiken |in plaats van ||, en &in plaats van &&? Heeft dit enig nut? Het lijkt erop dat er is. Soms.

De logische operatoren ||en &&worden van links naar rechts uitgevoerd volgens een zogenaamd lui principe .

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

Als expression1 gelijk is aan true, heeft het geen zin om te evalueren expression2 en expression3: het resultaat zal truehoe dan ook zijn.

Dienovereenkomstig wordt bij het evalueren van uitdrukkingen (ze worden van links naar rechts geëvalueerd) zodra we krijgen true, de evaluatie van de rest van de uitdrukkingen overgeslagen . En als expression2 en expression3inclusief methode-aanroepen, zullen deze methoden niet worden aangeroepen !

Hetzelfde geldt voor de &&logische operator:

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

Als expression1gelijk is aan false, heeft het geen zin om te evalueren expression2en expression3: het resultaat zal falsehoe dan ook zijn.

Dit is een belangrijk feit waarmee je dingen kunt schrijven als:

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

In het bovenstaande voorbeeld krijgt u nooit een NullPointerException , omdat s.length()het alleen wordt uitgevoerd als het eerste deel s! = nulldat is true.

Als sgelijk is aan null, het deel links van de &&operator is false, dan is het resultaat van de hele booleaanse uitdrukking false, dus het deel rechts ( s.length() > 0) wordt niet geëvalueerd.

Dat alles om te zeggen:

Als u de |operator of de &operator gebruikt, is er geen luie evaluatie : elke subexpressie wordt altijd geëvalueerd.



2. Bedieningsvoorrang in Java

Zoals je je waarschijnlijk herinnert van je wiskundeles op de middelbare school, heeft de vermenigvuldigingsoperator een hogere prioriteit dan de opteloperator. Haakjes hebben een nog hogere prioriteit: uitdrukkingen tussen haakjes worden eerst geëvalueerd, daarna vermenigvuldigen en delen, en dan optellen en aftrekken.

Operators in Java hebben ook een rangorde. Het verschil is dat a) er iets meer zijn, b) voor sommige operatoren worden de operanden van links naar rechts geëvalueerd, terwijl voor andere - van rechts naar links.

Hier is een tabel met alle Java-operators:

Categorie Exploitant associatief
Postfix () [] . Van links naar rechts
Unair ++ -- ! ~ Rechts naar links
Multiplicatief * / % Van links naar rechts
Additief + - Van links naar rechts
Verschuiven >> >>> << Van links naar rechts
relationeel > >= < <= Van links naar rechts
Gelijkwaardigheid == != Van links naar rechts
BitsgewijzeAND & Van links naar rechts
Exclusive OR(XOR) ^ Van links naar rechts
BitsgewijzeOR | Van links naar rechts
LogischAND && Van links naar rechts
LogischOR || Van links naar rechts
Voorwaardelijk ?: Rechts naar links
Opdracht = += -= *= /= %= >>= <<= &= ^= |= Rechts naar links
Komma , Van links naar rechts

De bovenste regel bevat de operators met de hoogste prioriteit. Haakjes ()worden gebruikt om expliciet de prioriteit in te stellen. Vierkante haken []worden gebruikt om toegang te krijgen tot een element met een specifieke index van een arrayvariabele. De puntoperator ( .) wordt gebruikt om toegang te krijgen tot velden en methoden met een verwijzing naar een object of klasse.

Hoe lager de operators in de tabel staan, hoe lager hun prioriteit.

Als u meerdere operatoren in een uitdrukking gebruikt, wees dan niet lui: voeg haakjes toe.

In Java kun je iets schrijven als if (a & 1<< b > ~c), maar dat zou je niet moeten doen. Je schrijft niet alleen code voor de compiler, maar ook voor andere programmeurs. Hoe leesbaarder de code, hoe beter.



3. Prefix- en postfix-toename

Zoals u al weet, heeft Java een toename-operator ( ++) en een afname-operator ( --). Respectievelijk verhogen en verlagen ze de waarde van een variabele met 1.

Wat u waarschijnlijk niet weet, is dat er twee soorten van deze operatoren zijn: prefix (de operator wordt voor de variabele geplaatst) en postfix (de operator wordt achter de variabele geplaatst). En twee soorten operators werken een beetje anders.

In Java kun je een uitdrukking als deze schrijven:

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

Als de ++operator na een variabele verschijnt en de variabele maakt deel uit van een uitdrukking (zoals in het bovenstaande voorbeeld), dan gebruikt de uitdrukking de huidige waarde van de variabele en pas daarna wordt de variabele verhoogd met 1.

Met andere woorden, zoiets zal gebeuren:

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

Dat wil zeggen, bzal zijn 5, niet 6zoals je op het eerste gezicht zou denken.

Als de ++operator vóór de variabele staat en de variabele maakt deel uit van een uitdrukking, wordt deze eerst verhoogd met 1en pas daarna wordt de waarde ervan in de uitdrukking gebruikt.

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

Het bovenstaande voorbeeld komt overeen met het volgende voorbeeld:

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

Hier bzal gelijk zijn aan 6.

Er is zelfs een voorbeeld dat door Java-programmeurs wordt gebruikt om te bepalen of iemand anders ook een Java-programmeur is:

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

Ja, dat mag je ook schrijven.

Dit voorbeeld zal prima compileren en in iets als dit veranderen:

int a = 5;

a = a + 1;
int v1 = a;

a = a + 1;
int v2 = a;

int b = v1 + v2;

Voor de --operator is alles precies hetzelfde.