Bewerten Sie Java-Ausdrücke mit Operatoren

Java-Anwendungen verarbeiten Daten, indem sie Ausdrücke auswerten , bei denen es sich um Kombinationen aus Literalen, Methodenaufrufen, Variablennamen und Operatoren handelt. Das Auswerten eines Ausdrucks erzeugt normalerweise einen neuen Wert, der in einer Variablen gespeichert, zum Treffen einer Entscheidung usw. verwendet werden kann.

In diesem Tutorial erfahren Sie, wie Sie Ausdrücke für Ihre Java-Programme schreiben. In vielen Fällen verwenden Sie Operatoren, um Ihre Java-Ausdrücke zu schreiben, und es gibt viele Arten von Operatoren , die Sie verwenden müssen. Ich werde kurz die Operatortypen von Java (einschließlich der additiven, bitweisen, logischen, bedingten, Verschiebungs- und Gleichheitstypen) und ihre Operanden vorstellen. Sie lernen auch wichtige Konzepte wie das Überladen von Operatoren und die Priorität von Operatoren kennen und sehen eine Demonstration der Konvertierung vom primitiven Typ. Ich werde mit einem kleinen Java-Programm schließen, mit dem Sie Konvertierungen vom primitiven Typ selbst üben können.

download Code abrufen Laden Sie den Quellcode herunter, zum Beispiel Anwendungen in diesem Tutorial. Erstellt von Jeff Friesen für JavaWorld.

Einfache Ausdrücke

Ein einfacher Ausdruck ist ein Literal, ein Variablenname oder ein Methodenaufruf. Es sind keine Bediener beteiligt. Hier einige Beispiele für einfache Ausdrücke:

52 // integer literal age // variable name System.out.println("ABC"); // method call "Java" // string literal 98.6D // double precision floating-point literal 89L // long integer literal

Ein einfacher Ausdruck hat einen Typ , der entweder ein primitiver Typ oder ein Referenztyp ist. In diesen Beispielen 52ist eine 32-Bit-Ganzzahl ( int); System.out.println("ABC");ist void ( void), weil es keinen Wert zurückgibt; "Java"ist eine Zeichenfolge ( String); 98.6Dist ein 64-Bit-Gleitkommawert mit doppelter Genauigkeit ( double); und 89List eine 64 Bit lange Ganzzahl ( long). Wir kennen ageden Typ nicht.

Experimentieren mit jshell

Sie können diese und andere einfache Ausdrücke ganz einfach mit ausprobieren jshell. Geben Sie beispielsweise 52an der jshell>Eingabeaufforderung ein und Sie erhalten etwa die folgende Ausgabe:

$1 ==> 52

$1ist der Name einer Arbeitsvariablen , jshelldie zum Speichern erstellt wird 52. (Scratch-Variablen werden immer dann erstellt, wenn Literale eingegeben werden.) Ausführen System.out.println($1)und Sie sehen 52als Ausgabe.

Sie können jshellmit dem -vBefehlszeilenargument ( jshell -v) ausführen , um ausführliches Feedback zu generieren. In diesem Fall wird die Eingabe 52würde zu der folgenden Meldung, dass die variable scratch enthüllt $1hat int(32-Bit - Ganzzahl) Typ:

| created scratch variable $1 : int

Versuchen Sie als nächstes einzugeben age. In diesem Fall erhalten Sie wahrscheinlich eine Fehlermeldung, dass das Symbol nicht gefunden wurde. Die Java-Shell geht davon aus, dass agees sich um eine Variable handelt, kennt jedoch ihren Typ nicht. Sie müssten einen Typ einfügen; Sehen Sie beispielsweise, was passiert, wenn Sie eingeben int age.

Zusammengesetzte Ausdrücke

Ein zusammengesetzter Ausdruck besteht aus einem oder mehreren einfachen Ausdrücken , die über einen Operator in einen größeren Ausdruck integriert werden. Dies ist eine Folge von Anweisungen, die symbolisch im Quellcode dargestellt werden. Der Bediener wandelt seine Expression Operanden (n) in einer anderen Wert. Zum Beispiel in 6 * 5dem Multiplikationsoperator (, *) Transformationen Operanden 6und 5in 30.

Zusammengesetzte Ausdrücke können zu größeren Ausdrücken kombiniert werden. 6 * 5 + 10Präsentiert beispielsweise einen zusammengesetzten Ausdruck 6 * 5und einen zusammengesetzten Ausdruck, der aus ihrem Produkt, dem Additionsoperator +und der Zahl besteht 10. Die Reihenfolge der Auswertung (zuerst multiplizieren und dann addieren) wird durch die Vorrangregel von Java bestimmt , auf die wir in Kürze eingehen werden.

Zusammengesetzte Ausdrücke können auch einfach sein

6 * 5ist ein zusammengesetzter Ausdruck, der aus zwei einfachen Ausdrücken besteht, 6und 5. Ist 6 * 5aber auch ein einfacher Ausdruck aus +Sicht. Der +Bediener sieht nur sein Produkt 30, was ein einfacher Ausdruck ist.

Operatoren und Operanden

Javas Operatoren werden nach ihrer Anzahl von Operanden klassifiziert:

  • Ein unärer Operator hat einen Operanden, zum Beispiel ein unäres Minus (z -5. B. ).
  • Ein binärer Operator hat zwei Operanden. Beispiele sind Multiplikation und Addition.
  • Ein ternärer Operator hat drei Operanden. Ein Beispiel ist der bedingte Operator ( ?:).

Javas Operatoren werden auch nach Position klassifiziert:

  • Ein Präfixoperator ist ein unärer Operator, der seinem Operanden vorangeht (z -5. B. ).
  • Ein Postfix-Operator ist ein unärer Operator, der seinem Operanden folgt (z. B. age++;- 1 zum agenumerischen Wert addieren ).
  • Ein Infix-Operator ist ein binärer oder ternärer Operator zwischen den Operanden des Operators (z age + 5. B. ).

Ein weiteres Beispiel für eine Muschel

In den folgenden Abschnitten werde ich weitere Operatoren vorstellen, in denen ich Beispiele in Form von Anwendungen vorstelle. Sie können diese Operatoren jshellauch wie folgt ausprobieren :

jshell> 6 + 2 $1 ==> 8 jshell> 7 * $1 $2 ==> 56

In diesem Fall geben wir zuerst den Ausdruck ein 6 + 2, der jshellausgewertet wird, und weisen die resultierende 8 der Scratch-Variablen zu $1. Als nächstes multiplizieren wir $1mit 7, wodurch 56 in der Scratch-Variablen gespeichert werden $2. Dieses Beispiel zeigt, dass Sie Arbeitsvariablen in Java-Ausdrücken verwenden können.

Überladene Bediener

Der Plus-Operator (+) ist ein Beispiel für einen überladenen Operator , bei dem es sich um einen Operator handelt, der eine von mehreren Operationen basierend auf den Typen seiner Operanden ausführt . Der Plus-Operator führt eine Ganzzahladdition durch, wenn beide Operanden Ganzzahlen sind, eine Gleitkommaaddition, wenn beide Operanden Gleitkommawerte sind, und eine Zeichenfolgenverkettung, wenn beide Operanden Zeichenfolgen sind. Der Minusoperator (-) ist ebenfalls überladen und führt eine Ganzzahl- oder Gleitkommasubtraktion durch.

Operatortypen in Java

Additive Operatoren

Die additiven Operatoren erhöhen oder verringern einen numerischen Wert durch Addition und Subtraktion. Additive Operatoren umfassen Addition ( +), Subtraktion ( -), Postdecrement ( --), Postincrement ( ++), Precrement ( --) und Preincrement ( ++). Die Zeichenfolgenverkettung ( +) wird ebenfalls als additiv angesehen. Hier ist eine formale Definition für jeden dieser Operatoren:

  • Zusatz : Da , wo jeder Operand von Zeichen oder numerischen Typ sein muss, fügen Sie zu und gibt die Summe. Beispiel : .operand1 + operand2operand2operand14 + 6
  • Subtraktion : Da , wo jeder Operand von Zeichen oder numerischen Typ sein muss, subtrahiert aus und die Differenz zurück. Beispiel : .operand1 - operand2operand2operand14 - 6
  • Postdecrement: Given variable--, where variable must be of character or numeric type, subtract 1 from variable's value (storing the result in variable) and return the original value. Example: x--;.
  • Postincrement: Given variable++, where variable must be of character or numeric type, add 1 to variable's value (storing the result in variable) and return the original value. Example: x++;.
  • Predecrement: Given --variable, where variable must be of character or numeric type, subtract 1 from its value, store the result in variable, and return the new decremented value. Example: --x;.
  • Preincrement: Given ++variable, where variable must be of character or numeric type, add 1 to its value, store the result in variable, and return the new incremented value. Example: ++x;.
  • String concatenation: Given operand1 + operand2, where at least one operand is of String type, append operand2's string representation to operand1's string representation and return the result. Example: "A" + "B".

The addition, subtraction, postdecrement, postincrement, predecrement, and preincrement operators can generate values that overflow the limits of the result type. For example, adding two large positive 64-bit integer values can produce a value that cannot be represented in 64 bits. The resulting overflow is not detected or reported by Java's additive operators.

Overflow detection in the Java standard class library

The standard class library's Math class includes methods for detecting overflows. For example, int addExact(int x, int y) adds the values in x and y, returning the sum or throwing an exception on overflow.

Example application: Additive operators

Listing 1 presents a small application for playing with Java's additive operators.

Listing 1. Additive operators in Java (AddOp.java)

class AddOp { public static void main(String[] args) { System.out.println(125 + 463); System.out.println(2.0 - 6.3); int age = 65; System.out.println(age); System.out.println(age--); System.out.println(age++); System.out.println(--age); System.out.println(++age); System.out.println("A" + "B"); } }

You learned in the previous tutorial how to use the JDK's javac tool to compile Java source code and the java tool to run the resulting application. Execute the following command to compile Listing 1:

javac AddOp.java

Assuming successful compilation, you should observe an AddOp.class file in the current directory. Execute the following command to run it:

java AddOp

AddOp responds by producing the following output:

588 -4.3 65 65 64 64 65 AB

Studying this output offers insight into the postincrement, postdecrement, preincrement, and predecrement operators. For postincrement/postdecrement, age's current value is output before the increment/decrement operation. For preincrement/predecrement, the operation is performed and its result is stored in age, and then age's new value is output.

Iterating with Java operators

The additive operators are especially useful in the context of an iteration statement, where they are used to advance to the next iteration. You'll learn about iteration statements in the next Java 101 tutorial.

Array index operator

The array index operator ([]) accesses an array element by providing the element's index (position). This operator is placed after the array variable's name, as in grades[0] (access the first element in the array assigned to grades; the first element is stored at index 0). Here's a formal definition:

Given variable[index], where index must be of integer (int) type, read a value from or store a value into variable's storage element at location index. Example: temperatures[1]

The value passed to index is a 32-bit integer that is either 0 or a positive value ranging to one less than the array's length, which is indicated by appending .length to the name of the array. For example, grades.length returns the number of elements in the array assigned to grades.

Array variables vs arrays

grades is not an array, but is a variable containing a reference to a region of memory that forms the array. This is true for all Java arrays. However, it's conventional to refer to grades or any array variable as an array.

Example application: Array index operator

Listing 2 presents the source code to an example application that lets you play with the array index operator.

Listing 2. Array index operator in Java (ArrayIndexOp.java)

class ArrayIndexOp { public static void main(String[] args) { int[] grades = { 89, 90, 68, 73, 79 }; System.out.println(grades[1]); grades[1] = 91; System.out.println(grades[1]); int index = 4; System.out.println(grades[index]); System.out.println(grades['C' - 'A']); // System.out.println(grades[1D]); } }

Listing 2 is somewhat more interesting than Listing 1. After creating a five-element, one-dimensional array of integers (via an array initializer) and assigning the array's reference to grades, main() proceeds to access various elements. Two items are of special interest:

  • The array index operator's index must ultimately be a 32-bit integer (0 or a positive value). You can specify the name of an integer variable (e.g., index), which contains the index value, as the index.
  • You can specify a calculation involving character literals. (Later in this tutorial I'll introduce type conversions, and you'll discover why 'C' - 'A' produces an integer (2), which serves as a valid index.)

The final example, which passes 1D as an index to the array index operator, is commented out because it will not compile. If you uncomment the line and attempt to compile Listing 2, you will receive an error message about incompatible types: "possible lossy conversion from double to int.."

Compile Listing 2 (javac ArrayIndexOp.java) and run the application (java ArrayIndexOp). You should observe the following output:

90 91 79 68

The array index operator and multidimensional arrays

You can use this operator with multidimensional arrays. For example, assuming a two-dimensional costs array, costs[0][1] accesses the element assigned to the first row (via [0]) and the second column (via [1]).

Assignment operators

The assignment operator (=) assigns an expression's value to a variable (e.g., i = 6;), including an array element (e.g., x[0] = 15;). The expression and variable must be assignment compatible, meaning their types must agree. For example, you cannot assign a string literal to an integer variable. I'll explain more about this when we discuss type conversions.

Die Verbindung Zuweisungsoperator ( +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=, >>>=) zu bewerten Ausdrücke und die Ergebnisse zu Variablen in einem Schritt zuzuordnen. Jeder Ausdruck und jede Variable muss zuweisungskompatibel sein. Jeder Operator dient als nützliche Verknüpfung. Anstatt anzugeben x = x + 3;, können Sie beispielsweise das kürzere und äquivalente angeben x += 3;.

Halte es kurz!

Anstatt x = x + 1;oder anzugeben x = x - 1;, können Sie auch das kürzere x += 1;oder angeben x -= 1;. Sie können noch mehr Tastenanschläge speichern , indem Sie das kürzere x++;oder angeben x--;.

Bitweise Operatoren