Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • Windows 8
  • Java modulo podjela. Operacije na primitivnim tipovima u Javi

Java modulo podjela. Operacije na primitivnim tipovima u Javi

Po redoslijedu prioriteta, nakon unarnih operatora slijede aritmetički operatori. Ova grupa uključuje četiri najčešća operatora: sabiranje, oduzimanje, množenje, dijeljenje. I ne samo oni. Postoji i modulo operator dijeljenja, koji je označen znakom %. Aritmetički operatori podijeljeni u dvije grupe. Prva grupa višeg prioriteta sadrži *, /, %. U drugom, redom, + i -.

Množenje i dijeljenje (* i /)

Operatori * i / vrše množenje i dijeljenje na svim primitivnim numeričkim tipovima i char. Kada se podijeli sa nulom, javlja se ArithmeticException.

Vjerovatno se pitate zašto vam pričam o množenju i dijeljenju, koje znate od prvog razreda. Međutim, u programiranju se bavimo nekim ograničenjima vezanim za predstavljanje brojeva u računaru. Ova ograničenja važe za sve formati brojeva, od bajta do duplog . Ali oni su najuočljiviji za integer tip int.

Ako pomnožite ili podijelite dva broja, rezultat se izračunava pomoću cjelobrojne aritmetike i pohranjuje u int ili long . Ako su brojevi vrlo veliki, rezultat će biti veći maksimalan broj, koji se može predstaviti ovim brojevima. To znači da rezultat neće moći biti ispravno kodiran od strane računara i neće imati nikakvog značenja. Na primjer, tip bajta se koristi za predstavljanje brojeva u rasponu od -128 do 127. Ako pomnožimo 64 i 4, rezultat 256, koji ima devet znakova u binarnoj notaciji 100000000, bit će kodiran kao 0 jer bajt koristi samo 8 znakova .

Razmotrimo podjelu. Ako dijelite u cjelobrojnoj aritmetici, rezultat mora biti cijeli broj. A to znači frakcijaće biti izgubljen. Na primjer, 7/4 nam daje 1,75, ali u cjelobrojnoj aritmetici to bi bilo 1.

Dakle, ako imate posla sa složeni izrazi, možete odabrati redoslijed množenja i dijeljenja. Ali imajte na umu da množenje može rezultirati overflow, a podjela - do gubitak tačnosti. Narodna mudrost vjeruje da će izvođenje množenja, a zatim dijeljenja, u većini slučajeva dati ispravan rezultat. Pogledajmo primjer:

1. int a = 12345, b = 234567, c, d;
2. dugo e, f;
3.
4. c = a * b / b; // mora biti jednako a=12345
5. d = a / b * b; // također treba biti jednak a=12345
6. System.out.println(“a je “ + a +
7. “\nb je “ + b +
8. “\nc je “ + c +
9. “\nd je “ + d);
10.
11. e = (dugo)a * b / b;
12. f = (dugo)a / b * b;
13. System.out.println(
14. “\ne je “ + e +
15. “\nf je “ + f);

Rezultat ovog fragmenta će proizvesti sljedeće:

A je 12345
b je 234567
c je -5965
d je 0
e je 12345
f je 0

Ne dozvolite da vam smetaju numeričke vrijednosti ovaj primjer. Važno je da kada smo prvo uradili množenje, dobili smo prelivanje (c je -5965) kada smo ga kodirali u int tip. Međutim, možemo dobiti ispravan rezultat ako ga kodiramo u duži tip, kao što je long . U oba slučaja, prva primjena podjele će biti pogubna za rezultat, bez obzira na dužinu njegovog tipa.

Modulo podjela %

Rezultat dijeljenja po modulu je ostatak dijeljenja. Na primjer, 7/4 je jednako 1 sa ostatkom 3. Prema tome, 7%4 = 3. Obično su operandi cjelobrojnog tipa, ali ponekad se operator primjenjuje na brojeve s pokretnim zarezom. Također biste trebali znati neke karakteristike ovog operatera, kada su operandi negativni.

Za negativne ili frakcijske operande, pravilo je: oduzimati desni operand od lijevog dok ovaj drugi ne bude manji od prvog. primjeri:

17%5 = ? 17-5=12>5; 12-5=7>5; 7-5=2<5. Значит 17%5 = 2

21%7? 21-7=14>7; 14-7=7=7; 7-7=0<7. Значит 21%7 = 0

7.6%2.9? 7.6-2.9=4.7>2.9; 4.7-2.9=1.8<2.9. Значит 7.6%2.9=1.8

Napomena: predznak rezultata (pozitivan ili negativan) u potpunosti je određen predznakom lijevog operanda, odnosno dividende.

Kada se modulo dijeljenje vrši na razlomcima, suština ove operacije je da se djelitelj oduzme nekoliko puta. Rezultat može biti i razlomak.

Jednostavno pravilo za negativne operande je: odbacite znak minus iz operanada, izvršite modulo podjelu sa pozitivnim operandima, a zatim rezultatu dodajte predznak minus ako je lijevi operand (dividenda) negativan.

Modulo dijeljenje, kao i normalno dijeljenje, može izazvati ArithmeticException ako je djelitelj (desni operand) jednak nuli.

Većina operacija na primitivnim tipovima se ne izvode korištenjem metoda, već pomoću posebnih simbola koji se nazivaju znak operacije.

Operator dodjele

Dodjeljivanje varijabli vrijednosti konstante, druge varijable ili izraza (varijable i/ili konstante razdvojene znakovima operatora) naziva se operacija dodjele i označen je znakom " = ", na primjer: x = 3 ; y = x; z = x; U Javi je moguće koristiti operator dodjeljivanja više puta u jednom izrazu, na primjer: x1 = x2 = x3 = 0; Ova operacija se izvodi od zdesna na lijevo, tj. varijabli x3 prvo se dodjeljuje vrijednost 0, zatim se varijabli x2 dodjeljuje vrijednost varijable x3 (0), a na kraju varijabli x1 dodjeljuje se vrijednost varijable x2 (0). operacije čiji su argumenti brojevi podijeljene su u dvije kategorije: unarno(unarni) znakovi operacija sa jednim argumentom i binarni(binarni) sa dva argumenta.

Unarne operacije

U Javi su definirani sljedeći unarni operatori:
  • unarni minus " - " – mijenja predznak broja ili izraza u suprotan;
  • unarni plus " + " – ne izvodi nikakve radnje nad brojem ili izrazom;
  • bitni komplement "~" (samo za cijele brojeve) – invertuje sve bitove brojčanog polja (mijenja 0 u 1 i 1 u 0);
  • inkrement "++" (samo za cijele brojeve) – povećava vrijednost varijable za 1;
  • dekrement " -- " (samo za cijele brojeve) – smanjuje vrijednost varijable za 1.
Primjeri unarnih operacija " + " i " - ": int i = 3 , j, k; j= - i; // j = -3 k = + i; // k = 3 Primjer operacije komplementa po bitovima: int a = 15 ; int b; b = ~a; // b = -16 Brojevi a i b su brojevi tipa int, tj. su interno predstavljeni od strane računara kao potpisani binarni celi brojevi dužine 32 bita, tako da bi binarni prikaz brojeva a i b izgledao ovako: a = 00000000 00000000 00000000 00001111 b = 111111111 1111111101110 mogu vidjeti iz ove reprezentacije, sve nulti bitovi u broju a se mijenjaju u jedan bit u b, a bitovi jedan u a se mijenjaju u nula bitove. Decimalni prikaz b je –16. Znakovi operacije povećanja i smanjenja mogu se postaviti prije ili poslije varijable. Ove opcije su imenovane u skladu s tim prefiks I postfix evidentiranje ovih transakcija. Notacija prefiksa za prijavu operatora vraća vrijednost svog operanda poslije evaluacija izraza. U postfiksnom zapisu, znak operacije kao prvo vraća vrijednost svog operanda i tek nakon toga izračunava inkrement ili dekrement, na primjer: int x = 1, y, z; y = ++x; z= x++ ; Varijabli y će biti dodijeljena vrijednost 2 jer će vrijednost x prvo biti povećana za 1, a zatim će rezultat biti dodijeljen varijabli y. Varijabli z će biti dodijeljena vrijednost 1 jer će prvo varijabli z biti dodijeljena vrijednost, a zatim će vrijednost x biti povećana za 1. U oba slučaja, nova vrijednost x će biti 2. Treba napomenuti da se u Javi, za razliku od jezika C, operacije dekrementiranja i povećanja mogu primijeniti i na stvarne varijable (tip float i double). Binarni znakovi operacija se dijele na operacije s numeričkim rezultatom i operacije poređenja čiji je rezultat Boolean vrijednost.

Aritmetičke binarne operacije

Java definira sljedeće aritmetičke binarne operacije:
  • dodatak "+";
  • oduzimanje " - ";
  • množenje " * ";
  • podjela "/";
  • izračunavanje ostatka dijeljenja cijelih brojeva "%" (vraća ostatak dijeljenja prvog broja drugim, a rezultat će imati isti predznak kao i dividenda), na primjer, rezultat operacije 5%3 će biti jednak 2, a rezultat operacije (-7) %(-4) će biti jednak -3. U Javi, operacija se može koristiti i za realne varijable (tip float ili double).
Binarni primjeri aritmetičke operacije: int x = 7, x1, x2, x3, x4, x5; x1 = x + 10 ; // x1 = 17 x2 = x – 8 ; // x2 = -1 x3 = x2 * x; // x3 = -7 x4 = x/ 4 ; // x4 = 1 (pri dijeljenju cijelih brojeva // razlomljeni dio se odbacuje) x5 = x% 4 // x5 = 3 (ostatak podjele// 7 po 4)

Bitove operacije

  • Bitne operacije tretiraju neobrađene numeričke vrijednosti kao polja bitova i na njima izvode sljedeće operacije:
  • postavljanje bit in i Pozicija polja rezultata je 1 ako su oba bita unutra i th pozicije operanada su jednake 1, ili 0 u suprotnom – po bitovima AND ("& ");
  • postavljanje bit in i Pozicija polja rezultata je 1 ako je barem jedan bit i th pozicije operanada su jednake 1, ili 0 u suprotnom – bitsko ILI (" | ");
  • postavljanje bit in i Pozicija polja rezultata je 1 ako su bitovi unutra i-te pozicije operanada nisu jednake jedna drugoj, ili na 0 u suprotnom – bitovsko isključivo OR (" ^ ");
  • pomak ulijevo od bitova polja prvog operanda za broj bitova koji je određen drugim operandom (predznačni bit broja se ne mijenja) - bitski pomak ulijevo uzimajući u obzir znak "<< ";
  • desno pomeranje bitova prvog polja operanda za broj bitova koji je određen drugim operandom (značni bit broja se ne menja) – bitovsko pomeranje udesno, uzimajući u obzir znak " >> ";
  • pomak udesno od bitova polja prvog operanda za broj bitova koji je određen drugim operandom (predznačni bit broja je također pomaknut) - bitski pomak udesno bez uzimanja u obzir " >>> " znak.
Primjeri bitnih operacija:
  1. Bitwise AND

    int x = 112 ; int y = 94; int z; z = x & y; // z=80: 00000000 00000000 00000000 01010000
  2. Bitwise OR

    int x = 112 ; // x: 00000000 00000000 00000000 01110000 int y = 94; // y: 00000000 00000000 00000000 01011110 int z; z = x | y; // z = 126: 00000000 00000000 00000000 01111110
  3. Isključivo po bitu OR

    int x = 112 ; // x: 00000000 00000000 00000000 01110000 int y = 94; // y: 00000000 00000000 00000000 01011110 int z; z = x^y; // z = 46: 00000000 00000000 00000000 00101110
  4. Pomak ulijevo na osnovu znaka

    int x = 31, z; // x: 00000000 00000000 00000000 00011111 z = x<< 2 ; // z = 124: 00000000 00000000 00000000 01111100
  5. Desni pomak sa znakom

    int x = - 17 , z; z = x >> 2 ; // z = -5: 11111111 11111111 11111111 11111011
  6. Desni pomak bez uzimanja u obzir predznaka

    int x = - 17 , z; // x: 11111111 11111111 11111111 11101111 z = x >>> 2 ; // z = 1073741819 // z: 00111111 11111111 11111111 11111011

Kombinovane operacije

U Javi možete koristiti za binarne aritmetičke operacije kombinovano(kompozitni) znakovi operatora: operacija identifikatora = izraz Ovo je ekvivalentno sljedećoj operaciji: identifikator = izraz operacije identifikatora Primjeri:
  1. Izraz x += b znači x = x + b.
  2. Izraz x -= b znači x = x - b.
  3. Izraz x *= b znači x = x * b.
  4. Izraz x /= b znači x = x / b.
  5. Izraz x %= b znači x = x % b.
  6. Izraz x &= b znači x = x & b.
  7. Izraz x |= b znači x = x | b.
  8. Izraz x ^= b znači x = x ^ b.
  9. Izraz x<<= b означает x = x << b .
  10. Izraz x >>= b znači x = x >> b.
  11. Izraz x >>>= b znači x = x >>> b.

Operacije poređenja

Java definira sljedeće operatore poređenja:
  • " == " (jednako), " != " (nije jednako),
  • " > " (veće od), " >= " (veće ili jednako),
  • " < " (меньше) " <= " (меньше или равно)
imaju dva operanda i vraćaju logičku vrijednost koja odgovara rezultatu poređenja ( false ili istinito). Imajte na umu da kada upoređujete dvije veličine za jednakost u Javi, kao u C i C++, simboli " == " (dva uzastopna znaka jednakosti bez razmaka), za razliku od operatora dodjeljivanja, koji koristi simbol " = ". Upotreba simbola " = " prilikom poređenja dvije vrijednosti ili uzrokuje grešku kompilacije ili dovodi do pogrešnog rezultata. Primjeri operacija poređenja: boolean isEqual, isNonEqual, isGreater, isGreaterOrEqual, isLess, isLessOrEqual; int x1 = 5, x2 = 5, x3 = 3, x4 = 7; je jednako = x1 == x2; // isEqual = true isNonEqual = x1 != x2; // isNonEqual = false isGreater = x1 > x3; // isGreater = true // isGreaterOrEqual = true isGreaterOrEqual = x2 >= x3; je Manje = x3< x1; // isLess = true isLessOrEqual = x1 <= x3; // isLessOrEqual = false

Bulove operacije

Bulove operacije se izvode na Booleovim varijablama i njihov rezultat je također vrijednost tipa boolean. Sljedeće Booleove operacije su definirane u Javi:
  • negacija "!" – zamjena false sa istinitim, ili obrnuto;
  • I operacija "&" – rezultat je istinit samo ako su oba operanda tačna, u suprotnom je rezultat lažan;
  • ILI operacija "|" – rezultat je istinit samo ako je barem jedan od operanada tačan, u suprotnom rezultat je lažan.
  • isključiva ILI operacija "^" – rezultat je istinit samo ako operandi nisu jednaki jedan drugom, u suprotnom je rezultat lažan.
Operacije " & ", " | " i " ^ " mogu se, kao i odgovarajuće bitne operacije, koristiti u složenim operacijama dodjeljivanja: " &= ", " |= " i " ^= " Osim toga, operacije " = " su primjenjivi na Booleove operande = " (jednako) i " != " (nije jednako). Kao što možete vidjeti iz definicije OR i AND operatora, OR operacija rezultira rezultatom true kada je prvi operand istinit, bez obzira na vrijednost drugog operanda, a AND operacija rezultira rezultatom false kada je prvi operand operand je netačan, bez obzira na vrijednost drugog operanda. Java definiše još dva Booleova operatora: druge verzije logičkih operatora AND i OR, poznatih kao logički operatori kratkog spoja: short-AND "&&" i kratki spoj OR "||". Kada koristite ove operacije, drugi operand se uopće neće evaluirati, što je korisno u slučajevima kada ispravno funkcioniranje desnog operanda ovisi o tome da li je lijevi operand istinit ili netačan. Primjeri Booleovih operacija: boolean isInRange, isValid, isNotValid, isEqual, isNotEqual; int x = 8; isInRange = x > 0 && x< 5 ; // isInRange = false isValid = x >0 || x > 5 ; // isValid = istina isNotValid = ! isValid; // isNotValid = false isEqual = isInRange == isValid; // isEqual = false // isNotEqual = true isNotEqual = isInRange != isValid

Uslovni rad

Uslovna operacija je zapisana u obliku izraz-1?izraz-2:izraz-3. U ovom slučaju, izraz izraz-1 se prvo procjenjuje, koji bi trebao dati Booleovu vrijednost, a zatim, ako izraz-1 ima vrijednost true, izraz-2 se procjenjuje i vraća kao rezultat operacije, ili (ako izraz- 1 se procjenjuje na false), izraz-2 se procjenjuje i vraća. , kao rezultat operacije, vraća se izraz-3. Primjer uslovne operacije: x= n> 1 ? 0 : 1 ; Varijabli x će biti dodijeljena vrijednost 0 ako je n>1 (izraz n>1 je istinit) ili 1 ako je n≤1 (izraz n>1 je netačan).

Operativni staž

Operacije u izrazima se izvode s lijeva na desno, međutim, u skladu s njihovim prioritetom. Dakle, operacije množenja u izrazu y = x + z* 5; će se izvršiti prije operacije sabiranja jer je prioritet operacije množenja veći od prioriteta operacije sabiranja. Prioriteti operacija (po opadajućem prioritetu) u Javi su dati u tabeli. 1.
Zagrade povećavaju prioritet operacija koje se nalaze unutar njih. Dakle, ako umetnete zagrade u gornji izraz: y = (x + z) * 5 ; tada će se prvo izvršiti operacija sabiranja, a zatim operacija množenja. Ponekad se zagrade koriste jednostavno kako bi izraz bio čitljiviji, na primjer: (x > 1 ) && (x<= 5 ) ;

Konverzija i livenje pri izvođenju operacija

Operacije dodjeljivanja i aritmetički izrazi mogu koristiti literale, varijable i izraze različitih tipova, na primjer: dvostruko y; bajt x; y = x + 5 ; Ovaj primjer dodaje bajt varijablu x u int literal 5 i dodjeljuje rezultat dvostrukoj varijabli y. U Javi, kao iu jeziku C, konverzije tipova prilikom evaluacije izraza mogu se izvršiti automatski ili korištenjem operatora za pretvaranje tipa. Međutim, pravila za uvođenje tipova se malo razlikuju od pravila jezika C i općenito su stroža nego u jeziku C. Prilikom izvođenja operacije dodjeljivanja, konverzija tipa se događa automatski ako proširenje transformacije(proširujuća konverzija) i dvije vrste su kompatibilne. Transformacije koje se šire su transformacije bajt® kratko® int® dugo® float® duplo. Za proširene konverzije, numerički tipovi, uključujući cijeli broj i pokretni zarez, kompatibilni su jedni s drugima. Međutim, numerički tipovi nisu kompatibilni sa char i booleovim tipovima. Tipovi char i boolean također su međusobno nekompatibilni. Java također izvodi automatsku konverziju tipa kada pohranjuje literalnu integer konstantu (koja je zadana vrijednost int) u varijablu tipa byte, short ili long (međutim, ako literal ima vrijednost izvan raspona važećih vrijednosti za taj tip, izdaje se poruka o grešci: mogući gubitak točnosti). Ako je konverzija sužavajuća konverzija, odnosno izvrši se bajt ¬ kratki ¬ char ¬ int ¬ long ¬ float ¬ dvostruka konverzija, onda takva konverzija može dovesti do gubitka preciznosti broja ili do njegovog izobličenja. Stoga, tokom suženih konverzija, prilikom kompajliranja programa, prikazuje se dijagnostička poruka o nekompatibilnosti tipa i datoteke klasa se ne kreiraju. Ova poruka će se također izdati ako pokušate pretvoriti izraz tipa byte ili short u varijablu tipa char. Ako je i dalje potrebno izvršiti takve konverzije, koristi se operacija cast tipa koja ima sljedeći format: ( tip-konverzija) značenje, Gdje tip-konverzija određuje tip u koji se dati podaci moraju konvertovati značenje, na primjer, kao rezultat izvršavanja operatora: bajt x = 71 ; char simbol = (char ) x; varijabla simbola će dobiti vrijednost " G ". Ako je vrijednost s pomičnim zarezom dodijeljena cjelobrojnom tipu, tada (ako vrijednost s pomičnim zarezom ima razlomački dio) dolazi i do eksplicitne konverzije tipa skraćivanje(skraćeni) brojevi. Dakle, kao rezultat izvršavanja operatora int x = (int) 77,85; varijabla x će dobiti vrijednost 77 . Ako je dodijeljena vrijednost izvan raspona tip-konverzija , tada će rezultat transformacije biti ostatak dijeljenja vrijednosti sa modulom opsega dodijeljenog tipa (za brojeve tipa bajt, modul opsega će biti jednak 256, skraćeno – 65536, za int – 4294967296 i dugo – 18446744073709551616). Na primjer, kao rezultat izvršavanja operatora byte x = (byte ) 514 ; varijabla x će dobiti vrijednost 2. Prilikom pretvaranja cijelih ili realnih brojeva u char podatke, konverzija u znak se događa ako je originalni broj u rasponu od 0 do 127, u suprotnom se znaku daje vrijednost "?". Prilikom izvođenja aritmetičkih i bitnih konverzija, sve bajt i kratke vrijednosti, kao i char , se proširuju u int , (sa numeričkom vrijednošću koda znakova koji se koristi u proračunima za char ) tada, ako je barem jedan operand tipa long , tip celobrojnog izraza se proširuje na long . Ako je jedan od operanada tipa float, tada se tip punog izraza proširuje na float, a ako je jedan od operanada tipa double, tada je tip rezultata double. Dakle, ako su varijable bajt a, c; kratko b; zatim u izrazu a + b* c – 15 L + 1,5F + 1,08 - 10; prvo, prije izračunavanja a + b*c, vrijednosti varijabli će se proširiti na int , zatim, pošto je konstanta 15 tipa long, rezultat izračuna će se proširiti na mnogo prije oduzimanja. Nakon toga, pošto je literal 1.5 tipa float, prije dodavanja sa ovim literalom, rezultat procjene a + b*c – 15L će se proširiti na float . Prije obavljanja sabiranja na broju 1.08, rezultat prethodnih izračunavanja će se proširiti na duplo (pošto su realne konstante po defaultu tipa double) i konačno, prije nego što se izvrši posljednji sabiranje, literal 10 (podrazumevani int) će biti proširen na duplo. Dakle, rezultat evaluacije izraza će biti tipa double . Automatske ekstenzije tipa (posebno kratke i ekstenzije od bajta do int) mogu uzrokovati loše prepoznate greške u vremenu kompajliranja. Na primjer, u operatorima: bajt x = 30 , y = 5 ; x = x + y; Varijable x i y će se proširiti na int prije nego što se izvrši sabiranje, a zatim će se pojaviti poruka o grešci kada se pokuša dodijeliti rezultat int varijabli bajta. Da biste to izbjegli, morate koristiti eksplicitnu konverziju tipa u drugom operatoru: x = (bajt) (x + y) ; Izraz x + y mora biti zatvoren u zagradama jer je prioritet operacije pretvaranja tipa zatvorene u zagrade veći od prioriteta operacije sabiranja. Usput, ako napišete drugi operator u obliku: x += y; tada neće biti poruke o grešci. Link do prvog
Studirajte da postanete "Game Developer" + zaposlenje

Operatori u Javi

Java koristi uobičajene aritmetičke operatore + - * / za predstavljanje operacija sabiranja, oduzimanja, množenja i dijeljenja.

Operator / označava cjelobrojnu podjelu ako su oba njegova argumenta cijeli brojevi. Inače, ovaj operator označava dijeljenje brojeva s pomičnim zarezom. Ostatak cjelobrojnog dijeljenja (tj. mod funkcija) je označen simbolom %.
Na primjer, 15/2 je jednako 7, 15%2 je jednako 1, a 15 je . 0/2 je jednako 7. 5.

Imajte na umu da deljenje celog broja sa 0 izaziva izuzetak, dok deljenje sa pomičnim zarezom sa 0 dovodi do beskonačnosti ili NaN.

Aritmetički operatori se mogu koristiti za inicijalizaciju varijabli.

int n = 5;
int a = 2 *n; // Vrijednost varijable a je 10.

Pogodno je koristiti skraćene binarne aritmetičke operatore u operatorima dodjeljivanja.

Na primjer, operater
x + = 4;
je ekvivalentan operatoru
x = x + 4;

(Kratki operatori dodjeljivanja se formiraju propisivanjem simbola aritmetičkog operatora, kao što je * ili %, prije simbola =, kao što je *= ili %=.)

Jedan od navedenih ciljeva Java jezika je mašinska nezavisnost.

Proračuni moraju proizvesti isti rezultat, bez obzira na to koja ih virtualna mašina izvodi. Za aritmetiku s pomičnim zarezom, ovo se pokazalo neočekivano teškim. Dvostruki tip koristi 64 bita za pohranjivanje numeričkih vrijednosti, ali neki procesori koriste 80-bitne registre s pomičnim zarezom. Ovi registri pružaju dodatnu preciznost tokom srednjih faza izračunavanja. Razmotrite sljedeći izraz kao primjer:

duplo w = x * y / z;

Mnogi Intel procesori procjenjuju izraz x * y i pohranjuju ovaj međurezultat u 80-bitni registar, zatim ga dijele vrijednošću varijable z i konačno zaokružuju odgovor na 64 bita. Na ovaj način možete povećati tačnost proračuna izbjegavanjem prelivanja. Međutim, ovaj rezultat može biti drugačiji ako se svi proračuni izvode na 64-bitnom procesoru.

Iz tog razloga, originalni opis Java virtuelne mašine je naveo da se svi srednji proračuni trebaju zaokružiti. Ovo je razbjesnilo kompjutersku zajednicu. Nisu samo zaokruženi proračuni ono što može uzrokovati prelijevanje. Oni su zapravo sporiji od preciznijih proračuna jer operacije zaokruživanja zahtijevaju vrijeme. Kao rezultat toga, programeri Java jezika su se predomislili, tražeći da riješe sukob između optimalnih performansi i odlične ponovljivosti.

Podrazumevano, programeri virtuelnih mašina sada dozvoljavaju upotrebu proširene preciznosti u srednjim proračunima. Međutim, metode označene ključnom riječi strictfp moraju koristiti precizne operacije s pomičnim zarezom kako bi osigurale ponovljive rezultate. Na primjer, glavna metoda se može označiti ključnim riječima kao što je prikazano u nastavku:
javni statički strictfp void main (args niza)

U ovom slučaju, sve naredbe unutar glavne metode će izvršiti tačne operacije nad brojevima s pomičnim zarezom.

Detalji ovih operacija su usko povezani sa operativnim karakteristikama Intel procesora. Po defaultu, srednji rezultati mogu koristiti prošireni eksponent, ali ne i proširenu mantisu. (Intel čipovi podržavaju zaokruživanje mantise bez žrtvovanja performansi.) Stoga je jedina razlika između podrazumevanih proračuna i tačnih proračuna ta što tačni proračuni mogu da izazovu prelivanje, dok podrazumevani proračuni ne.

Ako vam se oči zacakle dok čitate ovaj komentar, ne brinite. Za većinu programera ovo pitanje je potpuno nevažno. Prelivanje se ne događa u izračunima s pomičnim zarezom u većini slučajeva. U ovoj knjizi nećemo koristiti ključnu riječ strictfp.

Operatori povećanja i dekrementacije

Programeri, naravno, znaju da je jedna od najčešćih operacija sa numeričkim varijablama sabiranje ili oduzimanje jedne. U jeziku Java, kao iu jezicima C i C++, postoje operatori inkrementacije i dekrementacije: operator x++ dodaje jedan trenutnoj vrijednosti varijable x, a x- operator oduzima jednu od nje.

Na primjer, kod
int n = 12;
n++;
čini vrijednost varijable n jednakom 13.

Budući da ovi operatori mijenjaju vrijednost varijable, ne mogu se primijeniti na same brojeve. Na primjer, operator 4++ je nevažeći.

Postoje dvije vrste ovih operatora. Gore je prikazan "postfix" oblik operatora, u kojem se simboli operacije postavljaju iza operanda. Postoji i "prefiks" oblik - ++n.
Oba ova operatora povećavaju vrijednost varijable za jedan. Razlika između njih se pojavljuje samo kada se ovi operatori koriste unutar izraza. Prefiksni oblik operatora inkrementa prvo dodaje jedan vrijednosti varijable, dok postfiksni obrazac koristi staru vrijednost te varijable.

int m = 7;
int n = 7;
int a = 2 * ++m; // Sada je vrijednost a 16, a m je 8.
int b = 2 * n++; // Sada je vrijednost b 14, a n je 8.

(Budući da je C++ operator dao ime, to je bio razlog za prvu šalu na tu temu. Kritovi ističu da čak i naziv ovog jezika sadrži grešku: „Osim toga, ovaj jezik treba zvati ++C , jer želimo koristiti ovaj jezik tek nakon što je poboljšan.")

1. Osnovne aritmetičke operacije

Sljedeća tabela navodi osnovne aritmetičke operacije koje se koriste u jeziku Java:

Pogledajmo neka pravila za rad s aritmetičkim operacijama:

  • Izrazi se vrednuju s lijeva na desno osim ako se dodaju zagrade ili određene operacije imaju prednost.
  • Operatori *, / i % imaju veći prioritet od + i -.

Primjer 1: Aritmetičke operacije nad cjelobrojnim vrijednostima

Na primjer, u ovom kodu, varijable a I b imat će različita značenja:

Javna klasa BasicIntMath ( public static void main(String args) ( int a = 4 + 5 - 2 * 3; int b = 4 + (5 - 2) * 3; System.out.println("a = " + a) ; System.out.println("b = " + b); ) )

Rezultat izvršenja:

A = 3 b = 13

  • Operacija unarnog oduzimanja mijenja predznak svog jedinog operanda.
  • Unarni operator sabiranja jednostavno vraća vrijednost svog operanda. U principu, nije potrebno, ali je moguće.

Primjer 2. Unarne operacije sabiranja i oduzimanja

javna klasa UnarySignOperation (javni statički void main(String args) (dvostruki a = -6; dupli b = +6; System.out.println(a); System.out.println(b); ) )
  • Kada se operacija dijeljenja izvodi na cjelobrojnom tipu podataka, njen rezultat neće sadržavati frakcijsku komponentu.

Primjer 3: Dijeljenje cijelih brojeva

javna klasa IntDivision (javni statički void main(String args) (int a = 16 / 5; System.out.println(a); ) )

Rezultat pokretanja ovog programa:

  • Operandi aritmetičkih operacija moraju biti numeričkog tipa. Aritmetičke operacije se ne mogu izvoditi na Booleovim tipovima podataka, ali su dozvoljene na tipovima podataka char jer je u Javi ovaj tip u suštini vrsta tipa int.

Primjer 4. Aritmetičke operacije nad varijablama tipa char

javna klasa BasicCharMath1 (javni statički void main(String args) (char c = "n"; System.out.println(c); System.out.println(c + 1); System.out.println(c / 5) ; ) )

Rezultat izvršenja:

N 111 22

Primjer 5. Aritmetičke operacije nad varijablama tipa char

javna klasa BasicCharMath2 (javni statički void main(String args) (char c1 = "1"; char c2 = "\u0031"; char c3 = 49; System.out.println(c1 + c2 + c3); ) )

Rezultat izvršenja:

    Operator dijeljenja po modulu je označen simbolom %. Ovaj operator vraća ostatak kada se prvi broj podijeli s drugim. Prilikom dijeljenja cijelog broja, rezultat će također biti cijeli broj.

Primjer 6. Modulo dijeljenje

javna klasa DivisionByModule (javni statički void main(String args) (int a = 6 % 5; double b = 6,2 % 5,0; System.out.println(a); System.out.println(b); ) )

Rezultat izvršenja:

1 1.2000000000000002

2. Složene aritmetičke operacije sa dodjeljivanjem

Java ima posebne operatore koji kombinuju aritmetičke operacije sa operatorom dodele. Razmotrite sljedeći izraz:

A = a + 4;

U Javi se ova operacija može napisati na sljedeći način:

A += 4;

Složeni operatori dodjeljivanja ne samo da smanjuju veličinu koda, već vam također omogućavaju da izvršite automatske konverzije koje obični operatori ne mogu učiniti.

Primjer 5: Složene aritmetičke operacije sa dodjeljivanjem

javna klasa CompoundOperations ( public static void main(String args) ( int a = 1; int b = 2; int c = 3; a += 3; b *= 2; c += a * b; System.out.println (a); System.out.println(b); System.out.println(c); ) )

Pogledajmo jedan od pristupa unosu podataka iz standardnog toka kroz klasu java.util.Scanner. Učinimo to na primjeru jednostavnog zadatka sa vrlo korisne stranice e-olimp.com

Zadatak

Unesite jedan broj iz standardnog toka. Uz pretpostavku da je ovo pozitivan dvocifreni cijeli broj, ispišite svaku njegovu cifru zasebno (odvojeno razmakom) na standardni izlaz. Redoslijed brojeva ne treba mijenjati.

Testovi

Algoritam ne pretpostavlja nikakve specifične slučajeve. Radimo tri testa - najmanji broj u prihvatljivom rasponu, najveći i neku vrijednost u sredini raspona.

Ulaz Izlaz
10 1 0
99 9 9
54 5 4

Rješenje

Koristimo klasu java.util.Scanner, za unos podataka u cjelobrojnom formatu. I izračunajmo oba njegova broja.

Ispis cifara dvocifrenog cijelog broja

Java

class Main( public static void main (String args) izbacuje java.lang.Exception ( java.util.Scanner i = new java.util.Scanner(System.in); int n = i.nextInt(); System.out). println(n / 10 + " " + n % 10); ) )

klasa Main(

public static void main(String args) izbacuje java. lang. Izuzetak(

java. util. Skener i = nova java. util. Skener(System.in);

int n = i . nextInt();

Sistem. out . println (n / 10 + " " + n % 10 ) ;

Objašnjenja

  1. Opisivanje varijable i tip java.util.Scanner i odmah mu dodijeliti vrijednost novog objekta ove klase. Konstruktor pravi objekat Scanner'a iz standardnog unosa. One. i postaje nadgradnja na standardnom ulaznom toku. Ovo nam omogućava da čitamo cijeli broj umjesto da samo čitamo metodu čitaj() jedan po bajt.
  2. Koristeći metodu nextInt() pročitati niz brojeva i pretvoriti ga u cijeli broj. Broj pohranjujemo u varijablu n.
  3. n/ 10 je broj desetica u broju. Desetice će biti deset puta manje od samog broja. Izvodi se cjelobrojno dijeljenje - cijelo dijeljenje.
  4. n% 10 - izračunaj ostatak dijeljenja sa deset - broj jedinica je krajnja desna znamenka broja.
  5. n/ 10 + » » + n% 10 - umetnuti jedan razmak između dva cijela broja. U ovom slučaju, brojevi se takođe konvertuju u reprezentaciju nizova i sva tri niza se spajaju - nazvana konkatenacija nizova. Ovako operacija “+” radi sa podacima niza.

Ubrzavanje I/O

Uprkos svim pogodnostima ovog pristupa, prilično je spor i ponekad se zadaci ne završe na vrijeme. Možete značajno ubrzati svoj rad koristeći StreamTokenizer i PrintWriter.
Ovo će povećati količinu koda, ali će uštedjeti vrijeme.

I/O ubrzanje

Java

import java.io.*; import java.util.*; class Main ( static StreamTokenizer in = novi StreamTokenizer(novi BufferedReader(novi InputStreamReader(System.in))); static PrintWriter out = novi PrintWriter(System.out); static int nextInt() izbacuje IOException (in.nextToken(); return); (int)in.nval; ) public static void main(String args) izbacuje java.lang.Exception ( int n = nextInt(); out.println(n / 10 + " " + n % 10); out.flush( ); ) )

import java. io. * ;

import java. util. * ;

klasa Main(

static StreamTokenizer in = novi StreamTokenizer(novi BufferedReader(novi InputStreamReader(System. in)));

statički PrintWriter out = novi PrintWriter (System. out) ;

static int nextInt() izbacuje IOException (

Najbolji članci na ovu temu