Programmering

Evaluer Java-udtryk med operatører

Java-applikationer behandler data ved at evaluere udtryk, som er kombinationer af bogstaver, metodeopkald, variabelnavne og operatorer. Evaluering af et udtryk producerer typisk en ny værdi, som kan gemmes i en variabel, bruges til at træffe en beslutning osv.

I denne vejledning lærer du, hvordan du skriver udtryk til dine Java-programmer. I mange tilfælde bruger du operatører til at skrive dine Java-udtryk, og der er mange typer af operatører at vide, hvordan man bruger. Jeg vil kort introducere Java's operatortyper (inklusive additiver, bitvise, logiske, betingede, shift- og lighedstyper) og deres operander. Du lærer også om vigtige begreber som overbelastning af operatører og operatørprioritet, og du vil se en demonstration af konvertering af primitiv type. Jeg afslutter med et lille Java-program, som du kan bruge til at øve konverteringer af primitiv type alene.

download Hent koden Download kildekoden for eksempel applikationer i denne vejledning. Oprettet af Jeff Friesen til JavaWorld.

Enkle udtryk

EN simpelt udtryk er et bogstaveligt, variabelt navn eller metodeopkald. Ingen operatører er involveret. Her er nogle eksempler på enkle udtryk:

52 // heltal bogstavelig alder // variabelnavn System.out.println ("ABC"); // metodeopkald "Java" // strenge bogstavelig 98.6D // dobbelt præcision flydende-bogstavelig 89L // lang heltal bogstavelig

Et simpelt udtryk har en type, som enten er en primitiv type eller en referencetype. I disse eksempler 52 er et 32-bit heltal (int); System.out.println ("ABC"); er ugyldig (ugyldig) fordi den ikke returnerer nogen værdi;"Java" er en streng (Snor); 98.6D er en 64-bit dobbelt præcision floating-point værdi (dobbelt); og 89L er et 64-bit langt heltal (lang). Vi ved det ikke alder's type.

Eksperimenterer med jshell

Du kan nemt prøve disse og andre enkle udtryk ved hjælp af jshell. Indtast f.eks 52 ved jshell> prompt, og du modtager noget i retning af følgende output:

$1 ==> 52

$1 er navnet på en ridse variabel at jshell skaber for at gemme 52. (Skrabevariabler oprettes, hver gang der indtastes bogstaver.) Udfør System.out.println ($ 1) og du vil se 52 som output.

Du kan løbe jshell med -v kommandolinjeargument (jshell -v) for at generere detaljeret feedback. I dette tilfælde ind 52 ville resultere i følgende meddelelse, der afslører denne variabel i bunden $1 har int (32-bit heltal) type:

| oprettet scratch variabel $ 1: int

Prøv derefter at komme ind alder. I dette tilfælde modtager du sandsynligvis en fejlmeddelelse om, at symbolet ikke blev fundet. Java Shell antager det alder er en variabel, men den ved ikke dens type. Du bliver nødt til at medtage en type; se for eksempel hvad der sker, hvis du går ind int alder.

Sammensatte udtryk

EN sammensat ekspression består af et eller flere enkle udtryk integreret i et større udtryk via en operatør, som er en sekvens af instruktioner symbolsk repræsenteret i kildekoden. Operatøren forvandler sit udtryk operand (er) ind i en anden værdi. For eksempel i 6 * 5, multiplikationsoperatoren (*) transformerer operander 6 og 5 ind i 30.

Sammensatte udtryk kan kombineres til større udtryk. For eksempel, 6 * 5 + 10 præsenterer sammensat ekspression 6 * 5 og et sammensat udtryk bestående af deres produkt, additionsoperator +og nummeret 10. Evalueringsrækkefølgen (gang først og derefter tilføj) dikteres af Java'er forrangsregel, som vi snart kommer til.

Sammensatte udtryk kan også være enkle

6 * 5 er en sammensat ekspression, der består af to enkle udtryk, 6 og 5. Men 6 * 5 er også et simpelt udtryk fra +'s perspektiv. Det + operatøren ser kun deres produkt, 30, hvilket er et simpelt udtryk.

Operatører og operander

Java's operatører er klassificeret efter deres antal operander:

  • EN unary operatør har f.eks. en operand unary minus (f.eks., -5).
  • EN binær operatør har to operander, eksempler er multiplikation og addition.
  • EN ternær operatør har tre operander; et eksempel er betinget operatør (?:).

Java's operatører er også klassificeret efter position:

  • EN præfiksoperatør er en unary operatør, der går forud for sin operand (f.eks. -5).
  • EN postfix-operatør er en unary operatør, der følger sin operand (f.eks. alder ++; - tilføj 1 til alder's numeriske værdi).
  • En infix-operatør er en binær eller ternær operator mellem operatørens operander (f.eks. alder + 5).

Et andet jshell-eksempel

Jeg introducerer flere operatører i de følgende afsnit, hvor jeg præsenterer eksempler i form af applikationer. Du kan også prøve disse operatører med jshell, ligesom:

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

I dette tilfælde indtaster vi først udtryk 6 + 2, hvilken jshell evaluerer ved at tildele den resulterende 8 til ridse-variabel $1. Derefter multiplicerer vi $1 ved 7, der gemmer 56 i scratch variabel $2. Dette eksempel viser, at du kan bruge skrapevariabler i Java-udtryk.

Overbelastede operatører

Plus (+) operatoren er et eksempel på en overbelastet operatør, som er en operatør, der udfører en af ​​flere operationer baseret på typer af dets operander. Plusoperatoren udfører tilføjelse af heltal, når begge operander er heltal, flydende punktaddition, når begge operander er flydende punktværdier, og strengkoncentration, når begge operander er strenge. Minus (-) operatoren er også overbelastet og udfører heltal eller floating-point subtraktion.

Operatortyper i Java

Additive operatører

Det additivoperatorer øge eller formindske en numerisk værdi gennem addition og subtraktion. Additive operatorer inkluderer addition (+), subtraktion (-), postdecrement (--), postinkrement (++), forkølelse (--) og forhøjelse (++). Sammenkædning af streng (+) betragtes også som additiv. Her er en formel definition for hver af disse operatører:

  • Tilføjelse: Givet operand1 + operand2, hvor hver operand skal være af karakter eller numerisk type, tilføj operand2 til operand1 og returner summen. Eksempel: 4 + 6.
  • Subtraktion: Givet operand1 - operand2, hvor hver operand skal være af karakter eller numerisk type, trækkes fra operand2 fra operand1 og returner forskellen. Eksempel: 4 - 6.
  • Postdecrement: Givet variabel--, hvor variabel skal være af karakter eller numerisk type, trække 1 fra variabelværdi (lagring af resultatet i variabel) og returner den oprindelige værdi. Eksempel: x--;.
  • Postforøgelse: Givet variabel++, hvor variabel skal være af karakter eller numerisk type, tilføj 1 til variabelværdi (lagring af resultatet i variabel) og returner den oprindelige værdi. Eksempel: x ++;.
  • Predecrement: Givet --variabel, hvor variabel skal være af karakter eller numerisk type, trække 1 fra dens værdi, gemme resultatet i variabel, og returner den nye reducerede værdi. Eksempel: --x;.
  • Forhøjelse: Givet ++variabel, hvor variabel skal være af karakter eller numerisk type, tilføj 1 til dens værdi, gemme resultatet i variabel, og returner den nye forøgede værdi. Eksempel: ++ x;.
  • Sammenkædning af streng: Givet operand1 + operand2, hvor mindst en operand er af Snor skriv, tilføj operand2's strengrepræsentation til operand1's strengrepræsentation og returnere resultatet. Eksempel: "A" + "B".

Tilføjelses-, subtraktions-, postdecrement-, postincrement-, predecrement- og preincrement-operatorerne kan generere værdier, der overløber grænserne for resultattypen. For eksempel kan tilføjelse af to store positive 64-bit heltalværdier producere en værdi, der ikke kan repræsenteres i 64 bit. Det resulterende overløb detekteres eller rapporteres ikke af Java's additivoperatører.

Overløbsdetektering i Java-standardklassebiblioteket

Standard klassebiblioteket Matematik klasse inkluderer metoder til at detektere overløb. For eksempel, int addExact (int x, int y) tilføjer værdierne i x og y, returnere summen eller kaste en undtagelse på overløb.

Eksempel på anvendelse: Additive operatorer

Listing 1 præsenterer et lille program til at spille med Java's additive operatorer.

Liste 1. Tilsætningsoperatorer i Java (AddOp.java)

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

Du lærte i den foregående vejledning, hvordan du bruger JDK'er javac værktøj til at kompilere Java kildekode og java værktøj til at køre den resulterende applikation. Udfør følgende kommando for at kompilere liste 1:

javac AddOp.java

Under forudsætning af vellykket kompilering skal du observere en AddOp.klasse fil i det aktuelle bibliotek. Udfør følgende kommando for at køre den:

java AddOp

TilføjOp svarer ved at producere følgende output:

588 -4,3 65 65 64 64 65 AB

At studere dette output giver indsigt i postincrement-, postdecrement-, preincrement- og predecrement-operatørerne. Til postinkrement / postdecrement, alder's aktuelle værdi sendes ud før trinvise / mindskede operationer. Ved forforøgelse / forudgående udførelse udføres operationen, og resultatet lagres i alder, og så alderden nye værdi udgives.

Iterering med Java-operatører

Additivoperatorerne er især nyttige i forbindelse med en iterationserklæring, hvor de bruges til at gå videre til næste iteration. Du lærer om iterationserklæringer i den næste Java 101-vejledning.

Matrixindeksoperator

Det matrixindeksoperatør ([]) får adgang til et array-element ved at tilvejebringe elementets indeks (position). Denne operator placeres efter arrayvariabelens navn, som i karakterer [0] (få adgang til det første element i det array, der er tildelt karakterer; det første element er gemt i indeks 0). Her er en formel definition:

Givet variabel[indeks], hvor indeks skal være af heltal (int) type, læse en værdi fra eller gemme en værdi i variabel's opbevaringselement på stedet indeks. Eksempel: temperaturer [1]

Værdien videregivet til indeks er et 32-bit heltal, der enten er 0 eller en positiv værdi, der spænder til en mindre end arrayets længde, hvilket er angivet ved at tilføje .længde til arrayets navn. For eksempel, karakterer. længde returnerer antallet af elementer i det array, der er tildelt karakterer.

Array variabler vs arrays

karakterer er ikke en matrix, men er en variabel, der indeholder en henvisning til et hukommelsesområde, der danner arrayet. Dette gælder for alle Java-arrays. Det er dog konventionelt at henvise til karakterer eller en hvilken som helst matrixvariabel som en matrix.

Eksempel på anvendelse: Array index operator

Liste 2 viser kildekoden til et eksempel på et program, der giver dig mulighed for at spille med array-indeksoperatøren.

Liste 2. Array-indeksoperator i Java (ArrayIndexOp.java)

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

Listing 2 er noget mere interessant end Listing 1. Efter at have oprettet et fem-element, en-dimensionelt array af heltal (via en array initialisering) og tildelt arrayets reference til karakterer, hoved () fortsætter med at få adgang til forskellige elementer. To ting er af særlig interesse:

  • Arrayindeksoperatørens indeks skal i sidste ende være et 32-bit heltal (0 eller en positiv værdi). Du kan angive navnet på en heltalsvariabel (f.eks. indeks), som indeholder indeksværdien, som indeks.
  • Du kan angive en beregning, der involverer bogstaver. (Senere i denne vejledning introducerer jeg typekonverteringer, og du finder ud af hvorfor 'C' - 'A' producerer et heltal (2), der fungerer som et gyldigt indeks.)

Det sidste eksempel, der passerer 1D som et indeks til arrayindeksoperatøren, kommenteres, fordi det ikke kompileres. Hvis du ikke kommenterer linjen og forsøger at kompilere Listing 2, vil du modtage en fejlmeddelelse om inkompatible typer: "mulig lossy konvertering fra dobbelt til int.."

Kompilere lister 2 (javac ArrayIndexOp.java) og kør applikationen (java ArrayIndexOp). Du skal overholde følgende output:

90 91 79 68

Arrayindeksoperatoren og flerdimensionelle arrays

Du kan bruge denne operator med flerdimensionelle arrays. For eksempel under forudsætning af en todimensional omkostninger matrix, omkostninger [0] [1] adgang til det element, der er tildelt den første række (via [0]) og den anden kolonne (via [1]).

Opgaveoperatører

Det opgaveoperatør (=) tildeler et udtryks værdi til en variabel (f.eks. i = 6;), inklusive et array-element (f.eks. x [0] = 15;). Udtrykket og variablen skal være opgave kompatibel, hvilket betyder, at deres typer skal være enige. For eksempel kan du ikke tildele en strengliteral til en heltalsvariabel. Jeg forklarer mere om dette, når vi diskuterer typekonverteringer.

Sammensatte tildelingsoperatører (+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=, >>>=) evaluere udtryk og tildele resultaterne til variabler i et trin. Hvert udtryk og variabel skal være tildelingskompatibel. Hver operatør fungerer som en nyttig genvej. For eksempel i stedet for at specificere x = x + 3;, kan du angive det kortere og tilsvarende x + = 3;.

Hold det kort!

I stedet for at specificere x = x + 1; eller x = x - 1;, kan du angive den kortere x + = 1; eller x - = 1;. Du kan spare endnu mere tastetryk ved at angive den kortere x ++; eller x--;.

Bitvise operatører