Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • Savjet
  • Logički operatori. Aritmetičke operacije

Logički operatori. Aritmetičke operacije

Logički operatori rade samo sa operandima poput boolean... Svi logički operatori sa dva operanda kombinuju dve logičke vrednosti da formiraju rezultujuću logičku vrednost. Nemojte brkati sa.

Tabela logičkih operatora u Javi

Logički operatori & , | , ^ primijeniti na vrijednosti tipa boolean potpuno isto kao u odnosu na bitove cjelobrojnih vrijednosti. Logički operator ! invertuje (obrće) booleovo stanje: istina == netačno i !false == istina.

Table. Rezultati logičkog operatora

ABA | BA & bA ^ B! A
falsefalsefalsefalsefalsetačno
tačnofalsetačnofalsetačnofalse
falsetačnotačnofalsetačnotačno
tačnotačnotačnotačnofalsefalse

Skraćeni logički operatori

Pored standardnih operatera I (&) i ILI (|) postoje stenografski operateri && i || .

Ako pogledate tabelu, možete vidjeti da je rezultat izvršenja operatora ILI je jednako sa tačno tačno, bez obzira na vrijednost operanda B. Slično, rezultat izvršavanja operatora I je jednako sa false kada je vrijednost operanda A false, bez obzira na vrijednost operanda B. Ispada da ne moramo izračunati vrijednost drugog operanda, ako se rezultat može odrediti već prvim operandom. Ovo postaje korisno u slučajevima kada vrijednost desnog operanda ovisi o vrijednosti lijevog.

Razmotrite sljedeći primjer. Recimo da smo uveli pravilo - hraniti ili ne hraniti mačku, ovisno o broju uhvaćenih miševa sedmično. Štoviše, broj miševa ovisi o težini mačke. Što je mačka veća, više mora hvatati miševe.

Mačka, koja je pročitala stanje problema, bila sam uvrijeđena. Rekao je da sam zaostao za vremenom, a u avliji 21. veka - miševi se mogu uhvatiti pomoću mišolovki. Morao sam da mu objasnim da je to samo zadatak, a ne primer iz mog ličnog života.

Int mouse; // broj miševa int težina; // težina mačke u gramima miš = 5; težina = 4500; if (miš! = 0 & težina / miš< 1000) { mInfoTextView.setText("Можно кормить кота"); }

Ako pokrenete program, primjer će raditi bez problema - pet miševa sedmično je dovoljno da razmazite svoju mačku ukusnim doručkom. Ako uhvati četiri miša, tada će početi problemi s ishranom mačke, ali ne i s programom - radit će, jednostavno neće prikazati poruku o dozvoli hranjenja parazita.

Uzmimo sada ivični slučaj. Mačka se ulijenila i nije uhvatila nijednog miša. Varijabilna vrijednost mišće biti jednako 0, a u izrazu postoji operator dijeljenja. I ne možete dijeliti sa 0 i naš program će se zatvoriti s greškom. Čini se da smo dali opciju sa 0, ali Java vrednuje oba izraza miš! = 0 i težina / miš< 1000 , uprkos činjenici da se već u prvom izrazu vraća false.

Prepišimo uvjet na sljedeći način (dodajmo samo jedan simbol):

Ako (miš! = 0 && težina / miš< 1000) { mInfoTextView.setText("Можно кормить кота"); }

Program sada radi bez pada. Jednom kada je Java vidjela da se prvi izraz vraća false, tada se izraz drugog dijeljenja jednostavno zanemaruje.

Skraćene varijante operatora I i ILI obično se koriste u situacijama kada su potrebni Booleovi operatori, a njihovi rođaci od jednog znaka se koriste za bitne operacije.

Ternarni operater

Java jezik takođe ima poseban ternarni uslovni operator koji može da zameni određene tipove operatora. ako-onda-drugo je operater ?:

Ternarni operator koristi tri operanda. Izraz je napisan u sljedećem obliku:

LogicalCondition? izraz1: izraz2

Ako logicalCondition jednaki tačno, onda se izračunava izraz1 a njegov rezultat postaje rezultat izvršenja cijele naredbe. Ako logicalCondition jednaki false, onda se izračunava izraz2, a njegova vrijednost postaje rezultat rada operatera. Oba operanda izraz1 i izraz2 mora vratiti vrijednost istog (ili kompatibilnog) tipa.

Razmotrimo primjer u kojem je varijabla absval dodjeljuje se apsolutna vrijednost varijable val.

Int absval, val; val = 5; absval = val< 0 ? -val: val; // выводим число mInfoTextView.setText("" + absval); val = -5; absval = val < 0 ? -val: val; mInfoTextView.setText("" + absval);

Varijabilna absval vrijednost varijable će biti dodijeljena val ako je vrijednost veća ili jednaka nuli (drugi dio izraza). Ako je vrijednost varijable val je negativan, zatim varijabla absval vrijednost varijable je dodijeljena, uzeta sa znakom minus, kao rezultat, minus po minus će dati plus, odnosno pozitivnu vrijednost. Prepišimo kod koristeći ako-drugo:

Ako (val< 0) absval = -val; else absval = val;

Možete pogledati još jedan primjer sa ternarnim operatorom.

Većina operacija na primitivnim tipovima se ne izvode korištenjem metoda, već pomoću specijalnih znakova pod nazivom znak operacije.

Operacija dodjele

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

Unarne operacije

Sljedeće unarne operacije su definirane u Javi:
  • unarni minus "-" - mijenja znak broja ili izraza u suprotan;
  • unarno plus "+" - ne izvodi nikakvu radnju na broj ili izraz;
  • 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 bitu: int a = 15; int b; b = ~ a; // b = -16 Brojevi a i b su int, tj. su interno predstavljeni kao 32-bitni potpisani binarni cijeli brojevi, tako da će binarni prikaz brojeva a i b izgledati ovako: a = 00000000 00000000 00000000 00001111 b = 11111111 a se mijenja na one u b, a oni u a se mijenjaju na nulte bite. 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 snimanjem ovih operacija. Znak operatora u notaciji prefiksa vraća vrijednost svog operanda poslije vrednovanje izraza. Za postfiksnu notaciju, znak operacije 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 prvo vrijednost x 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 C, operacije smanjivanja i povećanja mogu primijeniti i na realne varijable (tipova float i double). Binarni znakovi operacija dijele se na operacije s numeričkim rezultatom i operacije poređenja čiji je rezultat logička 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 sa drugim, a rezultat će imati isti predznak kao i dividenda), na primjer, rezultat operacije 5% 3 će biti 2, i rezultat operacije (-7) % (- 4) će biti -3. U Javi, operacija se također može koristiti za stvarne varijable (kao što su float ili double).
Primjeri binarnih aritmetičkih operacija: 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 (prilikom dijeljenja cijelih brojeva // razlomljeni dio se odbacuje) x5 = x% 4 // x5 = 3 (ostatak od dijeljenja// 7 po 4)

Bitove operacije

  • Bitne operacije tretiraju originalne numeričke vrijednosti kao bitna polja i na njima rade sljedeće:
  • postavljanje bita na i-th pozicija polja rezultata na 1, ako su oba bita unutra i-te pozicije operanada su jednake 1, ili 0, u suprotnom - po bitovima I ("&");
  • postavljanje bita na i-ta pozicija polja rezultata na 1, ako je barem jedan bit u i-te pozicije operanada su jednake 1, ili 0, u suprotnom - bitno OR ("|");
  • postavljanje bita na i-th pozicija polja rezultata na 1, ako su bitovi u i-te pozicije operanada nisu jednake jedna drugoj, ili 0, u suprotnom - bitovsko ekskluzivno OR ("^");
  • pomak bitova polja prvog operanda ulijevo za broj bitova koji je određen drugim operandom (značni bit broja se u ovom slučaju ne mijenja) - bitski pomak ulijevo, 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 se u ovom slučaju ne mijenja) - bitski pomak udesno, uzimajući u obzir " >>" znak;
  • pomak udesno od bitova polja prvog operanda za broj bitova koji je određen drugim operandom (značni bit broja je također pomaknut u ovom slučaju) - bitovsko pomicanje 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. Pomaknite ulijevo, uzimajući u obzir znak

    int x = 31, z; // x: 00000000 00000000 00000000 00011111 z = x<< 2 ; // z = 124: 00000000 00000000 00000000 01111100
  5. Pomak udesno, uzimajući u obzir znak

    int x = - 17, z; z = x >> 2; // z = -5: 11111111 11111111 11111111 11111011
  6. Pomak udesno bez obzira na znak

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

Kombinovane operacije

U Javi, za binarne aritmetičke operacije, možete koristiti kombinovano(složeni) tokeni operacije: identifikator operacija = 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 tačno). Imajte na umu da kada upoređujete dvije vrijednosti za jednakost u Javi, kao u C i C ++, simboli " == "(dva znaka jednakosti bez razmaka), za razliku od operatora dodjeljivanja, koji koristi " = ". Upotreba simbola" = "pri usporedbi dvije vrijednosti ili uzrokuje grešku kompilacije ili daje netačan rezultat. 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 izvršavaju na logičkim varijablama i njihov rezultat je također vrijednost tipa boolean... U Javi su definirane sljedeće logičke operacije:
  • negacija "!" - zamjena false sa istinitim, ili obrnuto;
  • I operacija "&" - rezultat je istinit samo ako su oba operanda tačna, u suprotnom rezultat je lažan;
  • ILI operacija "|" - rezultat je istinit samo ako je barem jedan od operanada istinit, u suprotnom rezultat je lažan.
  • XOR operacija "^" - rezultat je istinit samo ako operandi nisu jednaki jedan drugom, u suprotnom je rezultat lažan.
Operatori "&", "|" i "^" mogu se, kao i odgovarajući bitni operatori, koristiti u složenim operatorima dodjeljivanja: "& =", "| =" i "^ =" Osim toga, operacije " = su primjenjivi na Booleove operande. = "(jednako) i"! = "(nije jednako). Kao što možete vidjeti iz definicije OR i AND, operacija OR procjenjuje se na true kada je prvi operand istinit, bez obzira na vrijednost drugog operanda, a AND operator procjenjuje na false kada je prvi operand netačan, bez obzira na vrijednost drugog operanda. Java definira još dvije logičke operacije: druge verzije logičkih AND i OR, poznate kao logičke operacije kratkog spoja: skraćeno AND "&&" i skraćeno OR "||". Koristeći ove operacije, drugi operand se uopće neće evaluirati, što je korisno u slučajevima kada ispravna operacija 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 se prvo procjenjuje izraz-1, koji bi trebao dati logičku vrijednost, a zatim, ako je izraz-1 istinit, izraz-2 se procjenjuje i vraća kao rezultat operacije, ili (ako je izraz-1 lažan ), a izraz-3 se vraća kao rezultat operacije. Primjer uslovne operacije: x = n> 1? 0: 1; Varijabli x će biti dodijeljena vrijednost 0 ako je n> 1 (izraz n> 1 daje vrijednost tačno) ili 1 ako je n≤1 (izraz n> 1 daje vrijednost netačno).

Starost operacija

Operacije u izrazima se izvode s lijeva na desno, međutim, prema njihovom prioritetu. 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 prikazani u tabeli. jedan.
Zagrade povećavaju prioritet operacija koje se nalaze u njima. 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 tipa i livenje prilikom izvođenja operacija

U dodeljivanju i aritmetičkim izrazima mogu se koristiti literali, varijable i izrazi različitih tipova, na primer: duplo y; bajt x; y = x + 5; Ovaj primjer dodaje bajt varijablu x literalu 5 (int) i dodjeljuje rezultat dvostrukoj varijabli y. U Javi, kao iu jeziku C, konverzije tipova u evaluaciji izraza mogu se izvršiti automatski ili pomoću operatora cast. Međutim, pravila kastinga su donekle drugačija od onih u jeziku C, i općenito su stroža nego u jeziku C. Prilikom izvođenja operacije dodjeljivanja, konverzija tipa se događa automatski ako transformacija proširenja(proširujuća konverzija) i ova dva tipa su kompatibilna... Proširene transformacije su transformacije bajt® kratko® int® dugo® float® duplo... Za konverzije proširenja, 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 nisu međusobno kompatibilni. Java također izvodi automatsku konverziju tipa kada pohranjuje literalnu integer konstantu (koja je po defaultu tipa int) u varijablama tipa byte, short ili long (međutim, ako literal ima vrijednost izvan raspona važećih vrijednosti za ovo tipa, prikazuje se poruka o grešci: mogući gubitak točnosti). Ako je konverzija sužavajuća konverzija, odnosno izvodi se bajt ¬ kratki ¬ char ¬ int ¬ dugo ¬ float ¬ double, onda takva konverzija može rezultirati gubitkom preciznosti ili izobličenjem broja. Stoga, uz sužavanje konverzija, kada se program kompajlira, prikazuje se dijagnostička poruka o nekompatibilnosti tipa i datoteke klasa se ne kreiraju. Ova poruka će se također prikazati kada pokušate pretvoriti izraze tipa byte ili short u varijablu tipa char. Ako je ipak potrebno izvršiti takve konverzije, koristi se operacija cast koja ima sljedeći format: ( tip konverzije) značenje, gdje tip konverzije definira tip u koji dato treba konvertirati značenje, na primjer, kao rezultat izvršavanja operatora: bajt x = 71; char simbol = (char) x; varijabla simbola će biti postavljena na "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 biti postavljena na 77. Ako je dodeljena vrednost izvan opsega tip-konverzije , tada će rezultat konverzije biti ostatak dijeljenja vrijednosti sa modulom opsega dodijeljenog tipa (za brojeve tipa bajt, modul opsega će biti 256, skraćeno - 65536, za int - 4294967296 , i dugo - 18446744073709551616). Na primjer, kao rezultat naredbe bajt x = (bajt) 514; varijabla x će biti postavljena na 2. Prilikom pretvaranja cijelih ili realnih brojeva u podatke tipa char, konverzija u znak se događa ako je originalni broj u rasponu od 0 do 127, u suprotnom znak dobiva vrijednost "?". Prilikom izvođenja aritmetičkih i bitnih konverzija, sve bajt i kratke vrijednosti, kao i char, se proširuju na int, (dok se numerička vrijednost koda karaktera 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 kompletnog izraza proširuje na float, a ako je jedan od operanada tipa double, tada će tip rezultata biti double. Dakle, ako su varijable deklarirane 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 povećati na mnogo prije oduzimanja. Nakon toga, pošto je literal 1.5 tipa float, rezultat izračunavanja a + b * c - 15L će se proširiti na float prije nego što se doda ovom literalu. Prije izvođenja sabiranja sa brojem 1.08, rezultat prethodnih proračuna će se proširiti na duplo (pošto su realne konstante po defaultu tipa double) i, konačno, prije izvođenja posljednjeg sabiranja, literal 10 (int po defaultu) će biti proširen na duplo. Dakle, rezultat evaluacije izraza će biti tipa double. Automatske ekstenzije tipa (posebno kratke i ekstenzije bajtova za int) mogu uzrokovati loše prepoznate greške u vremenu kompajliranja. Na primjer, u operatorima: bajt x = 30, y = 5; x = x + y; prije nego što se izvrši sabiranje, vrijednost varijabli x i y će se proširiti na int, a zatim će se prikazati poruka o grešci kada se pokuša dodijeliti rezultat izračunavanja tipa int varijabli tipa bajt. Da bi se to izbjeglo potrebno je koristiti eksplicitnu konverziju tipa u drugom operatoru: x = (bajt) (x + y); Morate staviti izraz x + y u zagrade jer je prioritet cast zatvorenog u zagradama veći od prioriteta operacije sabiranja. Usput, ako zapišete drugi operator kao: x + = y; neće biti poruke o grešci. Link do prvog

Posljednje ažuriranje: 30.10.2018

Većina operacija u Javi su slične onima koje se koriste u drugim jezicima sličnim C. Postoje unarne operacije (izvode se na jednom operandu), binarne operacije na dva operanda i ternarne operacije na tri operanda. Operand je varijabla ili vrijednost (na primjer, broj) uključena u operaciju. Razmotrimo sve vrste operacija.

Učestvuju u aritmetičkim operacijama brojevima. Java ima binarne aritmetičke operacije (izvode se na dva operanda) i unarne (izvode se na jednom operandu). Binarne operacije uključuju sljedeće:

    operacija sabiranja dva broja:

    Int a = 10; int b = 7; int c = a + b; // 17 int d = 4 + b; // jedanaest

    operacija oduzimanja dva broja:

    Int a = 10; int b = 7; int c = a - b; // 3 int d = 4 - a; // -6

    operacija množenja dva broja

    Int a = 10; int b = 7; int c = a * b; // 70 int d = b * 5; // 35

    operacija dijeljenja dva broja:

    Int a = 20; int b = 5; int c = a / b; // 4 dupla d = 22,5 / 4,5; // 5.0

    Vrijedi uzeti u obzir prilikom dijeljenja, jer ako su dva cijela broja uključena u operaciju, rezultat dijeljenja će biti zaokružen na cijeli broj, čak i ako je rezultat dodijeljen promjenljivoj s pomičnim brojem ili dvostrukom:

    Dvostruki k = 10/4; // 2 System.out.println (k);

    Da bi rezultat bio broj s pomičnim zarezom, jedan od operanada također mora predstavljati broj s pomičnim zarezom:

    Dvostruki k = 10,0 / 4; // 2.5 System.out.println (k);

    dobivanje ostatka dijeljenjem dva broja:

    Int a = 33; int b = 5; int c = a% b; // 3 int d = 22% 4; // 2 (22 - 4 * 5 = 2)

Postoje i dvije unarne aritmetičke operacije koje se izvode nad istim brojem: ++ (inkrement) i - (dekrement). Svaka od operacija ima dva tipa: prefiks i postfiks:

    ++ (prefiks inkrement)

    Pretpostavlja povećanje varijable za jedan, na primjer, z = ++ y (prvo se vrijednost varijable y povećava za 1, a zatim se njena vrijednost dodjeljuje varijabli z)

    Int a = 8; int b = ++ a; System.out.println (a); // 9 System.out.println (b); // 9

    ++ (postfix inkrement)

    Takođe predstavlja povećanje varijable za jedan, na primjer, z = y ++ (prvo se vrijednost y dodjeljuje z, a zatim se vrijednost y povećava za 1)

    Int a = 8; int b = a ++; System.out.println (a); // 9 System.out.println (b); // osam

    - (smanjenje prefiksa)

    smanjenje varijable za jedan, na primjer, z = - y (prvo se vrijednost varijable y smanjuje za 1, a zatim se njena vrijednost pripisuje varijabli z)

    Int a = 8; int b = --a; System.out.println (a); // 7 System.out.println (b); // 7

    - (postfiks dekrement)

    z = y-- (prvo se vrijednost varijable y dodjeljuje varijabli z, a zatim se vrijednost varijable y smanjuje za 1)

    Int a = 8; int b = a--; System.out.println (a); // 7 System.out.println (b); // osam

Aritmetički prioritet

Neke operacije imaju prednost nad drugima i stoga se izvode prve. Operacije u opadajućem redoslijedu prioriteta:

++ (inkrement), - (smanjenje)

* (množenje), / (podjela),% (ostatak od dijeljenja)

+ (sabiranje), - (oduzimanje)

Prioritet operacija treba uzeti u obzir prilikom izvršavanja skupa aritmetičkih izraza:

Int a = 8; int b = 7; int c = a + 5 * ++ b; System.out.println (c); // 48

Prvo će se izvršiti operacija povećanja ++ b, koja ima veći prioritet - povećaće vrijednost varijable b i kao rezultat je vratiti. Zatim se vrši množenje 5 * ++ b, a samo posljednji sabiranje je a + 5 * ++ b

Zagrade vam omogućavaju da redefinirate redoslijed izračunavanja:

Int a = 8; int b = 7; int c = (a + 5) * ++ b; System.out.println (c); // 104

Uprkos činjenici da operacija sabiranja ima niži prioritet, prvo će se izvršiti sabiranje, a ne množenje, jer je operacija sabiranja zatvorena u zagrade.

Asocijativnost operacija

Pored prioriteta, operacije se razlikuju po konceptu kao što je asocijativnost... Kada operacije imaju isti prioritet, redoslijed evaluacije je određen asocijativnošću operatora. Postoje dvije vrste operatora ovisno o asocijativnosti:

    Lijevi asocijativni operatori koji se izvršavaju s lijeva na desno

    Desno asocijativni operatori koji se izvršavaju s desna na lijevo

Na primjer, neke operacije, kao što su množenje i dijeljenje, imaju isti prioritet. Šta će onda biti rezultat u izrazu:

Int x = 10/5 * 2;

Da li ovaj izraz treba tumačiti kao (10/5) * 2 ili kao 10 / (5 * 2)? Zaista, u zavisnosti od interpretacije, dobićemo različite rezultate.

Pošto su svi aritmetički operatori (osim prefiksa inkrementa i dekrementa) lijevo asocijativni, odnosno izvršavaju se s lijeva na desno. Stoga se izraz 10/5 * 2 mora tumačiti kao (10/5) * 2, odnosno rezultat će biti 4.

Operacije s pomičnim zarezom

Treba napomenuti da brojevi s pokretnim zarezom nisu prikladni za finansijske i druge proračune gdje greške zaokruživanja mogu biti kritične. Na primjer:

Dvostruki d = 2,0 - 1,1; System.out.println (d);

U ovom slučaju, varijabla d neće biti jednaka 0,9, kao što bi se u početku moglo pretpostaviti, već 0,8999999999999999. Greške u preciznosti poput ove nastaju jer se binarni sistem koristi na niskom nivou za predstavljanje brojeva s pomičnim zarezom, ali ne postoji binarni prikaz za 0,1, kao ni za druge razlomke. Stoga, ako se u takvim slučajevima obično koristi klasa BigDecimal, koja vam omogućava da zaobiđete takve situacije.

Bilješke sa predavanja na Javi. Sesija 4

(nema) (nema) ::
(nijedna)
(V. Fesyunov)

Java operateri

Većina Java operacija je jednostavna i intuitivna. To su operacije kao što su +, -, *, /,<,>Operacije imaju sopstveni redosled izvođenja i prioritete. Tako u izrazu

prvo se vrši množenje, a zatim sabiranje, pošto množenje ima veći prioritet od sabiranja. U izrazu

prvo se izračunava a + b, a zatim se od rezultata oduzima c, jer je redoslijed ovih operacija slijeva na desno.

Ali Java operacije imaju svoje posebnosti. Ne ulazeći u detaljan opis najjednostavnijih operacija, zadržimo se na karakteristikama.

Počnimo sa zadaci... Za razliku od brojnih drugih programskih jezika u Javi, dodjela nije operator, već operacija. Semantika ove operacije može se opisati na sljedeći način.

  • Operacija dodjele je označena simbolom "=". Izračunava vrijednost svog desnog operanda i dodjeljuje ga lijevom operandu i vraća dodijeljenu vrijednost kao rezultat. Ovu vrijednost mogu koristiti druge operacije. Slijed od nekoliko zadataka se izvodi s desna na lijevo.

U najjednostavnijem slučaju, sve izgleda kao i obično.

Ovdje se događa upravo ono što intuitivno mislimo - izračunava se zbir a i b, rezultat se upisuje u x. Ali evo još dva primjera.

U prvom se prvo 1 upisuje u b, rezultat operacije je 1, zatim se ovaj rezultat unosi u a. U drugom primjeru izračunava se zbir a i b i rezultat se gubi. To je besmisleno, ali sintaktički valjano.

Operacije poređenja

Ovo su operacije>,<, >=, <=, != и ==. Следует обратить внимание, что сравнение на равенство обозначается двумя знаками "=". Операндами этих операций могут быть арифметические данные, результат — типа boolean.

Operacije povećanja, smanjenja

To su operacije ++ i -. Dakle, y ++ (inkrement) je skraćenica za y = y +1, slično kao i operacija smanjenja (-).

Ali postoji jedna suptilnost ovih operacija. Dolaze u dva oblika, prefiks (++ y) i postfiks (y ++). Učinak ovih operacija je isti - povećavaju (operacije smanjivanja - smanjuju) svoj operand za 1, ali njihov rezultat je drugačiji. Prefiksni oblik kao rezultat daje vrijednost operanda koji je već promijenjen za 1, a postfiksni oblik daje vrijednost operanda prije promjene.

A = 5; x = a ++; y = ++ a;

U ovom isječku, x će biti postavljeno na 5, a y na 7.

Operacija cjelobrojnog dijeljenja

Treba imati na umu da dijeljenje jedne cjeline drugom proizvodi cjelinu, a ne zaokružuje, već odbacuje razlomak.

Ostatak dijeljenja (modulo vrijednost)

Java ima % operator, koji označava ostatak podjele.

Proširene operacije dodjele

Pored uobičajene "=" operacije u Javi, postoje operacije + =, - =, * =, / =, itd. Ovo su stenografske oznake. Dakle, a + = b je potpuno ekvivalentno a = a + b. Slično, s drugim takvim operacijama.

Logičke operacije

! - negacija && - logičko "i" || - logično "ili"

Operandi ovih operacija moraju biti tipa boolean, rezultat je boolean. && i || imaju jednu posebnost - njihov desni operand možda neće biti izračunat ako je rezultat već poznat iz lijevog operanda. Dakle, ako je lijevi operand operacije && netačan, tada desni operand neće biti izračunat, jer rezultat je i dalje lažan.

Ovo svojstvo se mora uzeti u obzir, posebno kada desni operand sadrži poziv neke funkcije.

Bitove logičke operacije

Ovo su operacije

& - bitno "i" | - bitsko "ili" ^ - bitno "isključivo ili" ~ - bitna negacija

Izvršavaju se za svaki par bitova njihovih operanada.

Operacije smjena

<< — сдвиг влево >> - pomak udesno >>> - nepotpisani pomak udesno

Ove operacije pomjeraju vrijednost svog lijevog operanda za broj bitova specificiranih desnim operandom.

Uslovni rad

Ovo je jedina ternarna operacija, tj. operacija koja ima tri operanda. Prema tome, za to se ne koristi jedan znak operacije, već dva.

<условие> ? <выражение1> : < выражение2>

Ako<условие>istina je, rezultat je< выражение1>, inače< выражение2>.

Na primjer, "a< b ? a: b" вычисляет минимум из a и b.

Operacija livenja

Ovo je veoma važna operacija. Po defaultu, sve konverzije koje mogu dovesti do problema su zabranjene u Javi. Dakle, ne možete dodijeliti dugu vrijednost int operandu. U slučajevima kada je to i dalje potrebno, morate staviti eksplicitnu konverziju tipa.

Na primjer, pretpostavimo da metoda f (...) vraća long.

int x = (int) f (10);

Ovdje (int) je operacija konverzije tipa. Operacija konverzije tipa je označena imenom tipa u zagradama.

Ova operacija se ne odnosi samo na osnovne tipove, već i na klase. Ovo ćemo detaljnije pogledati kada pogledamo nasljeđe.

Literali (konstante)

Aritmetika

Primjeri aritmetičkih konstanti

10 - 010 je 8 - 0123 je 83 (1 * 64 + 2 * 8 + 3) - 0x10 je 16 - 0x123 je 291 (1 * 256 + 2 * 16 +3) - 1e5 je 100000 - 3 je 1,23 e.

Za označavanje tipa konstante koriste se sufiksi: l (ili L) - dugačak, f (ili F) - plutajući, d (ili D) - dvostruki. Na primjer,

1L je jedan, ali tipa dugačak.

Boolean literals

Booleovi literali su istiniti i lažni

String literali

Piše se u dvostrukim navodnicima, na primjer

"ovo je niz"

Literali znakova

Pišu se u apostrofima, na primjer "F", "w".

U literalima stringova i znakova postoje pravila za pisanje specijalnih znakova. karaktera. Prvo, postoji skup unaprijed definiranih specijalaca. karaktera. Ovo

- "\ n" - kraj reda (prevod u red) - "\ r" - povratak na nosač - "\ t" - tab

i niz drugih.

Drugo, možete eksplicitno napisati kod karaktera (samo ga trebate znati). Kod se obično piše u oktalnom sistemu: "\ 001" je znak sa kodom 1, itd.

Izjave

Operator - Izraz

Sintaksa

<выражение>;

Takav operator se sastoji od jednog izraza, na kraju je ";". Njegova akcija je da procijeni izraz, vrijednost izračunata ovim izrazom se gubi. One. obično takav izraz sadrži operator dodjeljivanja, iako sintaksa to ne zahtijeva.

A = 0; x = (a> b? a: b); cnt ++;

Uslovna izjava (ako)

Sintaksa

ako (<условие>) <оператор1>

Evo<условие>Je logičan izraz, tj. izraz koji vraća true ili false. Kao što možete vidjeti iz sintakse, drugi dio je opcionalan. Postoji jedan operator iza if i iza else. Ako trebate staviti nekoliko operatora tamo, onda morate staviti blok . Blokiraj počinje sa "(" i završava sa ")".

U Javi je uobičajeno da se uvijek stavlja blok, čak i ako postoji jedna izjava nakon if ili else.

If (a> b) (x = a;) else (x = b;) if (flag) (flag = false; init ();)

U posljednjem primjeru, flag je logička varijabla ili polje, init () je metoda koja se poziva ako je zastava istinita (kažu "ako je zastava postavljena").

Povratna izjava (već viđena)

Operator petlje prema preduvjetu (while)

Sintaksa

dok (<условие>) <оператор>

Kao i kod if naredbe, to je uobičajeno u Javi<оператор>staviti u vitičaste zagrade.

Int i = 0; dok (više) (x / = 2; više = (++ i< 10); }

U ovom primjeru, more bi trebalo biti logička varijabla ili polje, x neka aritmetička varijabla ili polje. Ciklus se izvodi 10 puta.

Operator postuslovne petlje (radi while)

Sintaksa

Uradi<оператор>dok (<условие>);

Operator petlje po postuslovu razlikuje se od operatora petlje po preduslovu samo po tome što se iteracija petlje u njemu uvijek izvršava barem jednom, dok u operatoru preduvjeta ne može biti niti jedna iteracija petlje (ako je uvjet odmah netačan).

Int i = 0; uradi (x \ = 2; više = (++ i< 10); } while (more);

Operator kontra petlje (za)

Sintaksa

za (<инициализация>; <условие>; <инкремент>) <оператор>

Zaglavlje takvog ciklusa sadrži tri izraza (u najjednostavnijem slučaju). Iz imena operatera može se shvatiti da služi za organizovanje ciklusa sa brojačem. Stoga izraz<инициализация>se izvršava jednom prije prve iteracije petlje. Nakon svake iteracije petlje, izraz se izvršava<инкремент>a zatim izraz<условие>... Posljednji izraz mora biti logičan i koristi se za postavljanje uvjeta za nastavak ciklusa. One. sve dok je to istina, petlja će nastaviti da se vrti.

Za praktičnost sastavljanja operatora petlje sa brojačem, u ovu konstrukciju je uvedeno mnogo proširenja.

  • <инициализация>možda nije izraz, već opis sa inicijalizacijom tipa "int i = 0".
  • <инициализация>može biti lista izraza razdvojenih zarezima, kao što je "i = 0, r = 1".
  • <инкремент>može biti i lista izraza, na primjer, "i ++, r * = 2"
  • Sve komponente (<инициализация>, <условие>i<инкремент>) nisu obavezni. Da izrazim<условие>to znači da se uslov uvijek smatra istinitim (tj. izlaz iz petlje mora biti organiziran na neki način unutar same petlje).

One. recimo sljedeću petlju (beskonačnu petlju):

Za (;;) (...)

Za (int i = 0; i< 10; i++) x /=2;

Ovo je najekonomičnija implementacija petlje od prethodnih primjera.

Prekini i nastavi izjave

U Javi nema naredbi goto. Kao što znate, goto vodi do nestrukturiranih programa. Naredbe break i continue su strukturirane analogije goto.

Mogu se koristiti u petljama, a break se također može koristiti u naredbi switch. Izvršenje naredbe break uzrokuje da se petlja odmah završi. Naredba continue uzrokuje završetak tekuće iteracije petlje i početak nove. U ovom slučaju, provjera uvjeta se i dalje izvodi, tako da nastavak može uzrokovati i kraj petlje.

Za (int i = 0;; i ++) (ako (oddOnly && i% 2 == 0) nastavi; y = (x + 1) / x; ako (y - x< 0.001) break; x = y; }

Ovdje je oddOnly logička varijabla. Ako je postavljeno, tada se sve iteracije petlje s parnim brojevima preskaču korištenjem naredbe nastavljanja;

Uslov završetka petlje u ovom primjeru se provjerava u sredini petlje, i ako je zadovoljen, petlja se prekida pomoću naredbe break.

Kod ugniježđenih petlji, naredbe break i continue mogu se odnositi ne samo na petlju u kojoj se nalaze, već i na petlju koja ga okružuje. Da biste to učinili, naredba petlje koja okružuje mora biti označena oznakom, koja mora biti navedena u naredbi break ili continue. Na primjer,

Lbl: dok (...) (... Za (...) (... Ako (...) break lbl;)...)

Ovdje će naredba break uzrokovati završetak i for petlje i while petlje.

Izjava o odabiru (prekidač)

Služi za organizovanje selekcije po nekoj vrednosti jedne od nekoliko grana izvršenja.

Sintaksa

Prekidač (<выражение>) (slučaj<константа1>: <операторы1>slučaj<константа2>: <операторы2> . . . }

Izraz mora vratiti vrijednost cijelog broja ili znakova, a konstante moraju biti istog tipa kao i vrijednost ovog izraza.

Elementi kućišta<константа>: "jesu oznake za skok, ako se vrijednost izraza poklapa sa konstantom, tada će se izvršiti skok na ovu oznaku. Ako vrijednost izraza ne odgovara nijednoj od konstanti, onda sve zavisi od prisustva zadanog fragmenta. Ako je je, tada dolazi do prijelaza na zadanu oznaku, ako ne, onda se cijeli switch naredba preskače.

  • U naredbi switch, fragmenti slučaja ne formiraju nikakve blokove. Ako nakon posljednje naredbe ovog case-fragmenta postoji sljedeći case, onda će se izvršenje nastaviti, počevši od prve izjave ovog case-fragmenta.
  • Zbog toga se naredba break obično koristi u naredbi switch. Nalazi se na kraju svake kutije-fragmenta.

Primjer (SymbolTest.java fajl)

Razmislite o demo programu koji koristi izraze for i switch.

Ovaj program generiše nasumično 100 znakova latinice i klasifikuje ih kao "samoglasnike", "suglasnike" i "ponekad samoglasnike". Posljednja kategorija uključuje simbole "y" i "w".

Javna klasa SymbolTest (javni statički void main (String args) (za (int i = 0; i< 100; i++) { char c = (char)(Math.random()*26 + "a"); System.out.print(c + ": "); switch (c) { case "a": case "e": case "i": case "o": case "u": System.out.println("гласная"); break; case "y": case "w": System.out.println("иногда гласная"); break; default: System.out.println("согласная"); } } } }

U ovom primjeru postoji nekoliko elemenata koji su nam novi.

  • Koristi se random () metoda klase Math. Pogledajmo dokumentaciju za klasu matematike i vidimo šta ona radi.
  • U iskazu char c = (char) (Math.random () * 26 + "a"); aritmetička vrijednost se dodaje simbolu. Sa ovim dodatkom u Javi, simbol se pretvara u broj koji je jednak kodu ovog simbola.
  • U naredbi System.out.print (c + ":"); koristi se ne println (...), već print (...). Print (...) metoda se razlikuje od println (...) samo po tome što se ne ispisuje u novi red, tako da će sljedeći print (...) ili println (...) naredba nastaviti s ispisom na ista linija.

Treba obratiti pažnju i na fragmente kućišta. Formalno postoji 7 takvih fragmenata, ali 5 od njih ne sadrže nikakve operatore. Dakle, možemo pretpostaviti da postoje 2 fragmenta padeža, ali svaki od njih ima nekoliko oznaka padeža.

Zadaća

  • 1 Promijenite SymbolTest.java tako da je broj generiranih simbola specificiran parametrom poziva programa.
  • 2 Napišite program koji uzima dva broja kao parametre poziva - dužine krakova pravouglog trougla i kao rezultat ispisuje uglove u stepenima.


(nijedna)

Top srodni članci