Procijenite Java izraze s operatorima

Java aplikacije obrađuju podatke procjenom izraza , koji su kombinacije literala, poziva metode, imena varijabli i operatora. Procjena izraza obično daje novu vrijednost koja se može pohraniti u varijablu, koristiti za donošenje odluke itd.

U ovom vodiču naučit ćete kako pisati izraze za svoje Java programe. U mnogim ćete slučajevima koristiti operatore za pisanje Java izraza, a postoje i mnoge vrste operatora koje treba znati koristiti. Ukratko ću predstaviti tipove Java operatora (uključujući aditivne, bitovne, logičke, uvjetne, shift i jednakost) i njihove operande. Također ćete naučiti o važnim konceptima kao što su preopterećenje operatora i prednost operatora, a vidjet ćete demonstraciju pretvorbe primitivnog tipa. Zaključit ću s malim Java programom koji možete koristiti za samostalno uvježbavanje pretvorbi primitivnog tipa.

preuzimanje Preuzmite kod Preuzmite izvorni kod za primjere aplikacija u ovom vodiču. Stvorio Jeff Friesen za JavaWorld.

Jednostavni izrazi

Jednostavan izraz je doslovno, ime varijable ili metoda poziva. Nijedan operater nije uključen. Evo nekoliko primjera jednostavnih izraza:

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

Jednostavni izraz ima tip , koji je ili primitivni tip ili referentni tip. U ovim je primjerima 5232-bitni cijeli broj ( int); System.out.println("ABC");je void ( void) jer ne vraća vrijednost; "Java"je niz ( String); 98.6Dje 64-bitna vrijednost s dvostrukom preciznošću s pomičnim zarezom ( double); i 89L64-bit je dugi cijeli broj ( long). Ne znamo agetip.

Eksperimentiranje s jshell-om

Možete jednostavno isprobati ove i druge jednostavne izraze pomoću jshell. Na primjer, unesite 52u jshell>prompt i dobit ćete nešto poput sljedećeg izlaza:

$1 ==> 52

$1je naziv varijable ogrebotine koju jshellstvara za pohranu 52. (Varijable ogrebotina kreiraju se kad god se unose literali.) Izvršite System.out.println($1)i vidjet ćete 52kao izlaz.

Možete pokrenuti jshells -vargumentom naredbenog retka ( jshell -v) da biste generirali opsežne povratne informacije. U ovom bi slučaju unos 52rezultirao sljedećom porukom koja otkriva da varijabla ogrebotina $1ima int(32-bitni cijeli broj) tip:

| created scratch variable $1 : int

Zatim pokušajte ući age. U tom ćete slučaju vjerojatno dobiti poruku o pogrešci da simbol nije pronađen. Java Shell pretpostavlja da ageje to varijabla, ali ne zna njezin tip. Morali biste uključiti tip; na primjer, pogledajte što će se dogoditi ako uđete int age.

Složeni izrazi

Izraz Spoj se sastoji od jednog ili više jednostavnim izrazima integrirane u većem ekspresiju putem operatera , što je sekvenca instrukcija simbolično prikazanih u izvornom kodu. Operator pretvara svoj operand (ove) izraza u drugu vrijednost. Na primjer, u 6 * 5, operator množenja ( *) transformacije operanda 6i 5na 30.

Složeni izrazi mogu se kombinirati u veće izraze. Na primjer, 6 * 5 + 10predstavlja složeni izraz 6 * 5i složeni izraz koji se sastoji od njihovog proizvoda, operatora zbrajanja +i broja 10. Redoslijed vrednovanja (prvo pomnoži, a zatim dodaj) diktira Javino pravilo prednosti , do kojeg ćemo uskoro doći.

Složeni izrazi mogu biti i jednostavni

6 * 5je složeni izraz koji se sastoji od dva jednostavna izraza, 6i 5. Ali to 6 * 5je i jednostavan izraz iz +perspektive. +Operater vidi samo njihov proizvod, 30, koji je jednostavan izraz.

Operatori i operandi

Java operateri klasificirani su prema broju operanda:

  • Predznak ima jedan operand, na primjer predznak minus (npr -5).
  • Binarni operator ima dva operanda, primjeri su množenje i dodatak.
  • Ternarni operator tri operanada; primjer je uvjetni operator ( ?:).

Java operateri također su klasificirani prema položaju:

  • Prefiks operator je predznak koji prethodi njegovu operand (npr -5).
  • Postfix operater je predznak da slijedi njegov operand (npr age++;- dodajte 1 do age„s brojčanom vrijednosti).
  • Umetnuti operator je binarni ili trodjelna operator između operanada operatera (npr age + 5).

Još jedan jshell primjer

U sljedećim odjeljcima predstavit ću više operatora, gdje ću predstaviti primjere u obliku aplikacija. Također biste mogli isprobati ove operatore na sljedeći jshellnačin:

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

U ovom slučaju, prvo unosimo izraz 6 + 2koji jshellprocjenjuje, dodjeljujući rezultirajuću varijablu 8 ogrebotinama $1. Dalje, množimo $1sa 7, što pohranjuje 56 u varijablu ogrebotina $2. Ovaj primjer pokazuje da u Java izrazima možete koristiti varijable ogrebotina.

Preopterećeni operatori

Operator plus (+) primjer je preopterećenog operatora , koji je operator koji izvodi jednu od nekoliko operacija na temelju vrsta svojih operanda. Operator plus izvodi zbrajanje cjelobrojnih vrijednosti kada su oba operanda cjelobrojni, zbrajanje s pomičnom zarezom kada su oba operanda vrijednosti s pomičnom zarezom i spajanje nizova kada su oba operanda nizovi. Operator minus (-) je također preopterećen, izvršava oduzimanje cijelog broja ili plutajuće točke.

Tipovi operatora u Javi

Operatori aditiva

Operatori aditiva povećavaju ili smanjuju brojčanu vrijednost zbrajanjem i oduzimanjem. Aditivni operateri uključuju sabiranje ( +), oduzimanje ( -), postdekrement ( --), postinkrement ( ++), preddekrement ( --) i predinkrement ( ++). Spajanje nizova ( +) također se smatra aditivom. Evo formalne definicije za svakog od ovih operatora:

  • Dodatak : S obzirom , gdje svaki operand mora biti slova ili brojeve tipa, dodati da se i vratiti sumu. Primjer: .operand1 + operand2operand2operand14 + 6
  • Oduzimanje : S obzirom , gdje svaki operand mora biti slova ili brojeve tipa, oduzimanje od i vratiti razliku. Primjer: .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.

Spoj je dodjela operatora ( +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=, >>>=) ocijeniti izraza i dodijeliti rezultate varijabli u jednom koraku. Svaki izraz i varijabla moraju biti kompatibilni s dodjelom. Svaki operater služi kao korisna prečica. Na primjer, umjesto navođenja x = x + 3;, možete navesti kraće i ekvivalentno x += 3;.

Neka bude kratko!

Umjesto da navedete x = x + 1;ili x = x - 1;, možete navesti kraći x += 1;ili x -= 1;. Možete uštedjeti još više tipki tako što ćete navesti kraći x++;ili x--;.

Bitovni operatori