1. Boolesche Operationen
Die Operatoren |
„and“ &
können nicht nur auf Zahlen, sondern auch auf boolesche Ausdrücke angewendet werden.
Aber wie Sie bereits wissen, gibt es &&
und ||
-Operatoren. Warum sollten wir |
anstelle von ||
und &
anstelle von verwenden &&
? Hat das irgendeinen Sinn? Es scheint so zu sein. Manchmal.
Die logischen Operatoren ||
und &&
werden nach einem sogenannten Lazy-Prinzip von links nach rechts ausgeführt .
(expression1) || (expression2) || (expression3)
Wenn expression1
gleich ist true
, macht eine Auswertung keinen Sinn expression2
und expression3
: Das Ergebnis wird true
unabhängig sein.
Dementsprechend wird bei der Auswertung von Ausdrücken (sie werden von links nach rechts ausgewertet) die Auswertung der restlichen Ausdrücke übersprungentrue
, sobald wir erhalten . Und wenn und Methodenaufrufe enthalten, werden diese Methoden nicht aufgerufen !expression2
expression3
Das Gleiche gilt für den &&
logischen Operator:
(expression1) && (expression2) && (expression3)
Wenn expression1
gleich ist false
, macht eine Auswertung keinen Sinn expression2
und expression3
: Das Ergebnis wird false
unabhängig sein.
Dies ist eine wichtige Tatsache, die es Ihnen ermöglicht, Dinge zu schreiben wie:
String s = null;
if (s != null && s.length() > 0) {
Das obige Beispiel führt niemals zu einer NullPointerException , da s.length()
es nur ausgeführt wird, wenn der erste Teil s! = null
lautet true
.
Wenn s
gleich ist null
, ist der Teil links vom &&
Operator false
, dann ist das Ergebnis des gesamten booleschen Ausdrucks false
, sodass der Teil rechts ( s.length() > 0
) nicht ausgewertet wird.
Wenn Sie den |
Operator oder den &
Operator verwenden, gibt es keine verzögerte Auswertung : Jeder Unterausdruck wird immer ausgewertet.
2. Operationspriorität in Java
Wie Sie sich wahrscheinlich aus Ihrem Mathematikunterricht an der High School erinnern, hat der Multiplikationsoperator eine höhere Priorität als der Additionsoperator. Klammern haben eine noch höhere Priorität: Ausdrücke in Klammern werden zuerst ausgewertet, dann Multiplikation und Division und dann Addition und Subtraktion.
Auch für Operatoren in Java gilt eine Rangfolge. Der Unterschied besteht darin, dass a) es etwas mehr davon gibt, b) bei einigen Operatoren die Operanden von links nach rechts ausgewertet werden, bei anderen dagegen von rechts nach links.
Hier ist eine Tabelle mit allen Java-Operatoren:
Kategorie | Operator | Assoziativ |
---|---|---|
Postfix | () [] . |
Von links nach rechts |
Einstellig | ++ -- ! ~ |
Rechts nach links |
Multiplikativ | * / % |
Von links nach rechts |
Zusatzstoff | + - |
Von links nach rechts |
Verschiebung | >> >>> << |
Von links nach rechts |
Relational | > >= < <= |
Von links nach rechts |
Gleichwertigkeit | == != |
Von links nach rechts |
BitweiseAND |
& |
Von links nach rechts |
Exclusive OR (XOR) |
^ |
Von links nach rechts |
BitweiseOR |
| |
Von links nach rechts |
LogischAND |
&& |
Von links nach rechts |
LogischOR |
|| |
Von links nach rechts |
Bedingt | ?: |
Rechts nach links |
Abtretung | = += -= *= /= %= >>= <<= &= ^= |= |
Rechts nach links |
Komma | , |
Von links nach rechts |
Die oberste Zeile enthält die Operatoren mit der höchsten Priorität. Klammern ()
werden verwendet, um die Priorität explizit festzulegen. Eckige Klammern []
werden verwendet, um auf ein Element an einem bestimmten Index einer Array-Variablen zuzugreifen. Der Punktoperator ( .
) wird verwendet, um über einen Verweis auf ein Objekt oder eine Klasse auf Felder und Methoden zuzugreifen.
Je weiter unten die Operatoren in der Tabelle stehen, desto niedriger ist ihre Priorität.
Wenn Sie in einem Ausdruck mehrere Operatoren verwenden, seien Sie nicht faul: Fügen Sie Klammern hinzu.
In Java können Sie so etwas schreiben if (a & 1<< b > ~c)
, sollten es aber nicht. Sie schreiben Code nicht nur für den Compiler, sondern auch für andere Programmierer. Je besser der Code lesbar ist, desto besser.
3. Präfix- und Postfix-Inkrement
Wie Sie bereits wissen, verfügt Java über einen Inkrementoperator ( ++
) und einen Dekrementoperator ( --
). Sie erhöhen bzw. verringern den Wert einer Variablen um 1
.
Was Sie wahrscheinlich nicht wissen, ist, dass es zwei Arten dieser Operatoren gibt: Präfix (der Operator wird vor der Variablen platziert) und Postfix (der Operator wird nach der Variable platziert). Und zwei Arten von Operatoren funktionieren etwas unterschiedlich.
In Java können Sie einen Ausdruck wie diesen schreiben:
int a = 5;
int b = a++;
Wenn der ++
Operator nach einer Variablen steht und die Variable Teil eines Ausdrucks ist (wie im Beispiel oben), verwendet der Ausdruck den aktuellen Wert der Variablen und erst danach wird die Variable um erhöht 1
.
Mit anderen Worten, es wird so etwas passieren:
int a = 5;
int b = a;
a = a + 1;
Das heißt, b
es wird 5
nicht so sein, 6
wie man auf den ersten Blick denken könnte.
Wenn der ++
Operator vor der Variablen steht und die Variable Teil eines Ausdrucks ist, wird sie zunächst um erhöht 1
und erst danach wird ihr Wert im Ausdruck verwendet.
int a = 5;
int b = ++a;
Das obige Beispiel entspricht dem folgenden Beispiel:
int a = 5;
a = a + 1;
int b = a;
Hier b
wird gleich sein 6
.
Es gibt sogar ein Beispiel, das von Java-Programmierern verwendet wird, um festzustellen, ob jemand anderes ebenfalls ein Java-Programmierer ist:
int a = 5;
int b = ++a + ++a;
Ja, das kannst du auch schreiben.
Dieses Beispiel lässt sich problemlos kompilieren und in etwa so aussehen:
int a = 5;
a = a + 1;
int v1 = a;
a = a + 1;
int v2 = a;
int b = v1 + v2;
Für den --
Betreiber ist alles genau gleich.
GO TO FULL VERSION