Programmering

Evaluer Java-uttrykk med operatører

Java-applikasjoner behandler data ved å evaluere uttrykkene, som er kombinasjoner av bokstaver, metodeanrop, variabelnavn og operatører. Evaluering av et uttrykk gir vanligvis en ny verdi, som kan lagres i en variabel, brukes til å ta en beslutning, og så videre.

I denne opplæringen lærer du hvordan du skriver uttrykk for Java-programmene dine. I mange tilfeller bruker du operatører til å skrive Java-uttrykk, og det er mange typer operatører å vite hvordan du bruker. Jeg vil kort introdusere Java's operatortyper (inkludert additiv, bitvis, logisk, betinget, skift og likhetstyper) og deres operander. Du vil også lære om viktige konsepter som operatøroverbelastning og operatørprioritet, og du vil se en demonstrasjon av konvertering av primitiv type. Jeg avslutter med et lite Java-program som du kan bruke til å praktisere konverteringer av primitiv type alene.

last ned Få koden Last ned kildekoden for eksempel applikasjoner i denne opplæringen. Skapt av Jeff Friesen for JavaWorld.

Enkle uttrykk

EN enkelt uttrykk er et bokstavelig, variabelt navn eller metodeanrop. Ingen operatører er involvert. Her er noen eksempler på enkle uttrykk:

52 // heltall bokstavelig alder // variabelnavn System.out.println ("ABC"); // metoden kalles "Java" // streng bokstavelig 98.6D // dobbel presisjon flytende punkt bokstavelig 89L // lang heltall bokstavelig

Et enkelt uttrykk har en type, som enten er en primitiv type eller en referansetype. I disse eksemplene, 52 er et 32-biters heltall (int); System.out.println ("ABC"); er ugyldig (tomrom) fordi den ikke gir noen verdi;"Java" er en streng (String); 98.6D er en 64-bits flytende punktverdi med dobbel presisjon (dobbelt); og 89L er et 64-biters heltall (lang). Vi vet ikke aldersin type.

Eksperimentere med jshell

Du kan enkelt prøve disse og andre enkle uttrykk ved hjelp av jshell. For eksempel, skriv inn 52jshell> spør, og du vil motta noe som følgende utgang:

$1 ==> 52

$1 er navnet på en skrapevariabel at jshell skaper å lagre 52. (Skrapevariabler opprettes når bokstavene skrives inn.) Utfør System.out.println ($ 1) og du får se 52 som utdata.

Du kan løpe jshell med -v kommandolinje argument (jshell -v) for å generere detaljerte tilbakemeldinger. I dette tilfellet, inn 52 vil resultere i følgende melding, som avslører den ripervariabelen $1 har int (32-biters heltall) type:

| opprettet skrapevariabel $ 1: int

Prøv deretter å gå inn alder. I dette tilfellet vil du sannsynligvis motta en feilmelding om at symbolet ikke ble funnet. Java Shell antar det alder er en variabel, men den vet ikke typen. Du må inkludere en type; for eksempel se hva som skjer hvis du går inn int alder.

Sammensatte uttrykk

EN sammensatt uttrykk består av ett eller flere enkle uttrykk integrert i et større uttrykk via en operatør, som er en sekvens av instruksjoner symbolsk representert i kildekoden. Operatøren forvandler sitt uttrykk operand (er) inn i en annen verdi. For eksempel i 6 * 5, multiplikasjonsoperatøren (*) transformerer operander 6 og 5 inn i 30.

Sammensatte uttrykk kan kombineres til større uttrykk. For eksempel, 6 * 5 + 10 presenterer sammensatt uttrykk 6 * 5 og et sammensatt uttrykk bestående av deres produkt, tilleggsoperatør +og nummeret 10. Rekkefølgen av evaluering (multipliser først og legg deretter til) er diktert av Java forrangsregel, som vi snart kommer til.

Sammensatte uttrykk kan også være enkle

6 * 5 er et sammensatt uttrykk som består av to enkle uttrykk, 6 og 5. Men 6 * 5 er også et enkelt uttrykk fra +perspektiv. De + operatøren ser bare sitt produkt, 30, som er et enkelt uttrykk.

Operatører og operander

Java-operatører er klassifisert etter antall operander:

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

Java-operatører er også klassifisert etter posisjon:

  • EN prefiksoperatør er en unarisk operatør som går foran sin operand (f.eks. -5).
  • EN postfix-operatør er en unarisk operatør som følger operandens (f.eks. alder ++; - legg til 1 til alders numeriske verdi).
  • An infix-operatør er en binær eller ternær operatør mellom operatørens operander (f.eks. alder + 5).

Nok et jshell-eksempel

Jeg vil introdusere flere operatører i de følgende avsnittene, hvor jeg presenterer eksempler i form av applikasjoner. Du kan også prøve disse operatørene med jshell, som så:

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

I dette tilfellet skriver vi først inn uttrykk 6 + 2, hvilken jshell evaluerer, og tildeler den resulterende 8 til skrapevariabelen $1. Deretter multipliserer vi $1 av 7, som lagrer 56 i skrapevariabel $2. Dette eksemplet viser at du kan bruke skrapevariabler i Java-uttrykk.

Overbelastede operatører

Pluss (+) operatoren er et eksempel på en overbelastet operatør, som er en operatør som utfører en av flere operasjoner basert på typer av operandene. Plussoperatøren utfører tillegg av heltall når begge operandene er heltall, flytende punktaddisjon når begge operandene er flytpunktsverdier, og streng sammenkobling når begge operandene er strenger. Minus (-) operatoren er også overbelastet, og utfører heltall eller flytende punkt subtraksjon.

Operatørtyper i Java

Tilsetningsoperatører

De additivoperatører øke eller redusere en numerisk verdi gjennom addisjon og subtraksjon. Tilsetningsoperatører inkluderer tillegg (+), subtraksjon (-), postdecrement (--), postincrement (++), forutsetning (--) og forøkning (++). Sammenslåing av streng (+) anses også å være tilsetningsstoff. Her er en formell definisjon for hver av disse operatørene:

  • Addisjon: Gitt operand1 + operand2, der hver operand må være av karakter eller numerisk type, legg til operand2 til operand1 og returner summen. Eksempel: 4 + 6.
  • Subtraksjon: Gitt operand1 - operand2der hver operand må være av karakter eller numerisk type, trekk fra operand2 fra operand1 og returner forskjellen. Eksempel: 4 - 6.
  • Postdecrement: Gitt variabel--, hvor variabel må være av karakter eller numerisk type, trekk 1 fra variabelverdi (lagrer resultatet i variabel) og returner den opprinnelige verdien. Eksempel: x--;.
  • Postinkrement: Gitt variabel++, hvor variabel må være av karakter eller numerisk type, legg 1 til variabelverdi (lagrer resultatet i variabel) og returner den opprinnelige verdien. Eksempel: x ++;.
  • Forutsetning: Gitt --variabel, hvor variabel må være av karakter eller numerisk type, trekke 1 fra verdien, lagre resultatet i variabel, og returner den nye reduserte verdien. Eksempel: --x;.
  • Forhøyning: Gitt ++variabel, hvor variabel må være av karakter eller numerisk type, legg 1 til verdien, lagre resultatet i variabel, og returner den nye økte verdien. Eksempel: ++ x;.
  • Strengsammenkobling: Gitt operand1 + operand2, hvor minst en operand er av String skriv, legg til operand2sin strengrepresentasjon til operand1streng streng representasjon og returnere resultatet. Eksempel: "A" + "B".

Tilleggs-, subtraksjons-, postdecrement-, postincrement-, predecrement- og preincrement-operatørene kan generere verdier som overløper grensene for resultattypen. Hvis du for eksempel legger til to store positive 64-biters heltallverdier, kan du produsere en verdi som ikke kan vises i 64 bits. Det resulterende overløpet blir ikke oppdaget eller rapportert av Java-additivoperatører.

Overløpsdeteksjon i Java standard klassebibliotek

Standard klassebiblioteket Matte klasse inkluderer metoder for å oppdage overløp. For eksempel, int addExact (int x, int y) legger til verdiene i x og y, returnere summen eller kaste et unntak på overløp.

Eksempel på applikasjon: Tilsetningsoperatorer

Listing 1 presenterer et lite program for å spille med Java's additive operatorer.

Oppføring 1. Tilsetningsoperatører 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 forrige opplæring hvordan du bruker JDK-ene javac verktøy for å kompilere Java kildekode og java verktøy for å kjøre den resulterende applikasjonen. Utfør følgende kommando for å kompilere Listing 1:

javac AddOp.java

Forutsatt vellykket samling, bør du observere en AddOp.klasse filen i gjeldende katalog. Utfør følgende kommando for å kjøre den:

java AddOp

AddOp svarer ved å produsere følgende utdata:

588 -4,3 65 65 64 64 65 AB

Å studere denne produksjonen gir innsikt i postincrement, postdecrement, preincrement og predecrement operatører. For postincrement / postdecrement, aldersin nåværende verdi sendes ut før trinn for trinn / reduksjon. For preinkrement / predecrement utføres operasjonen og resultatet lagres i alder, og så alderden nye verdien sendes ut.

Iterere med Java-operatører

Tilsetningsoperatørene er spesielt nyttige i sammenheng med en iterasjon uttalelse, hvor de brukes til å gå videre til neste iterasjon. Du lærer om iterasjonsuttalelser i neste Java 101-opplæring.

Array indeksoperatør

De arrayindeksoperatør ([]) får tilgang til et array-element ved å oppgi elementets indeks (posisjon). Denne operatøren plasseres etter arrayvariabelens navn, som i karakterer [0] (få tilgang til det første elementet i matrisen som er tilordnet karakterer; det første elementet er lagret i indeks 0). Her er en formell definisjon:

Gitt variabel[indeks], hvor indeks må være av heltall (int) skriv inn, les en verdi fra eller lagre en verdi i variabellagringselement på stedet indeks. Eksempel: temperaturer [1]

Verdien overført til indeks er et 32-biters heltall som enten er 0 eller en positiv verdi som strekker seg til en mindre enn matrisens lengde, som er indikert ved å legge til .lengde til navnet på matrisen. For eksempel, karakterer.lengde returnerer antall elementer i matrisen som er tilordnet karakterer.

Arrayvariabler vs matriser

karakterer er ikke en matrise, men er en variabel som inneholder en referanse til et område av minnet som danner matrisen. Dette gjelder for alle Java-arrays. Det er imidlertid vanlig å referere til karakterer eller en hvilken som helst matrixvariabel som en matrise.

Eksempel på applikasjon: Array index operator

Oppføring 2 presenterer kildekoden for et eksempel på et program som lar deg spille med arrayindeksoperatøren.

Oppføring 2. Array index operator 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 noe mer interessant enn Listing 1. Etter å ha opprettet et femelement, en-dimensjonalt array med heltall (via en array initializer) og tilordnet arrayets referanse til karakterer, hoved() fortsetter å få tilgang til forskjellige elementer. To ting er av spesiell interesse:

  • Arrayindeksoperatørens indeks må til slutt være et 32-biters heltall (0 eller en positiv verdi). Du kan spesifisere navnet på en heltallvariabel (f.eks. indeks), som inneholder indeksverdien, som indeks.
  • Du kan spesifisere en beregning som inkluderer bokstavbokstaver. (Senere i denne opplæringen introduserer jeg typekonvertering, og du vil oppdage hvorfor 'C' - 'A' produserer et heltall (2), som fungerer som en gyldig indeks.)

Det siste eksemplet, som går 1D som en indeks til matriseindeksoperatøren, kommenteres fordi den ikke kompileres. Hvis du ikke kommenterer linjen og prøver å kompilere Listing 2, vil du motta en feilmelding om inkompatible typer: "mulig lossy konvertering fra dobbelt til int.."

Kompilere oppføring 2 (javac ArrayIndexOp.java) og kjør applikasjonen (java ArrayIndexOp). Du bør følge følgende utdata:

90 91 79 68

Arrayindeksoperatøren og flerdimensjonale matriser

Du kan bruke denne operatøren med flerdimensjonale matriser. For eksempel å anta en todimensjonal kostnader matrise, koster [0] [1] får tilgang til elementet som er tilordnet den første raden (via [0]) og andre kolonne (via [1]).

Oppdragsoperatører

De oppdragsoperatør (=) tilordner et uttrykks verdi til en variabel (f.eks. jeg = 6;), inkludert et matriseelement (f.eks. x [0] = 15;). Uttrykket og variabelen må være oppgave kompatibel, noe som betyr at typene deres må være enige. For eksempel kan du ikke tilordne en streng bokstavelig til en heltallvariabel. Jeg vil forklare mer om dette når vi diskuterer typekonvertering.

Sammensatte oppdragsoperatører (+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=, >>>=) evaluere uttrykk og tilordne resultatene til variabler i ett trinn. Hvert uttrykk og variabel må være oppgavekompatibel. Hver operatør fungerer som en nyttig snarvei. For eksempel i stedet for å spesifisere x = x + 3;, kan du spesifisere kortere og tilsvarende x + = 3;.

Hold det kort!

I stedet for å spesifisere x = x + 1; eller x = x - 1;, kan du spesifisere den kortere x + = 1; eller x - = 1;. Du kan spare enda mer tastetrykk ved å spesifisere den kortere x ++; eller x--;.

Bitvise operatører

$config[zx-auto] not found$config[zx-overlay] not found