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 true
hoe 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 expression3
inclusief methode-aanroepen, zullen deze methoden niet worden aangeroepen !
Hetzelfde geldt voor de &&
logische operator:
(expression1) && (expression2) && (expression3)
Als expression1
gelijk is aan false
, heeft het geen zin om te evalueren expression2
en expression3
: het resultaat zal false
hoe 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! = null
dat is true
.
Als s
gelijk 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.
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, b
zal zijn 5
, niet 6
zoals 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 1
en 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 b
zal 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.
GO TO FULL VERSION