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 trueunabhä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 !expression2expression3

Das Gleiche gilt für den &&logischen Operator:

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

Wenn expression1gleich ist false, macht eine Auswertung keinen Sinn expression2und expression3: Das Ergebnis wird falseunabhä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! = nulllautet true.

Wenn sgleich 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.

Das alles zu sagen:

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, bes wird 5nicht so sein, 6wie 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 1und 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 bwird 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.