Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ
  • në shtëpi
  • Lajme
  • Veprimet aritmetike. Operacionet mbi llojet primitive në Java

Veprimet aritmetike. Operacionet mbi llojet primitive në Java

Operatorët në gjuha Java janë karaktere speciale që i tregojnë përkthyesit se dëshironi të kryeni një operacion në disa operandë. Disa operatorë kërkojnë një operand, ata quhen unare. Disa operatorë vendosen para operandëve dhe thirren prefiksi, të tjerat - pas, quhen postfiks operatorët. Shumica e operatorëve vendosen midis dy operandëve, operatorë të tillë quhen fiks operatorët binare. Ekziston një operator tresh që funksionon në tre operandë.

Java ka 44 operatorë të integruar. Ato mund të ndahen në 4 klasa - aritmetikë, bitwise, operatorët e krahasimit Dhe ngacmues truri.

Operatorët aritmetikë

Operatorët aritmetikë përdoren për llogaritjet në të njëjtën mënyrë si në algjebër (shih tabelën më poshtë për një përmbledhje të operatorëve aritmetikë). Operatorët e vlefshëm duhet të jenë të llojeve numerike. Për shembull, përdorni këta operatorë për të punuar llojet booleanështë e pamundur, por për të punuar me llojin char është e mundur, sepse në Lloji Java char është një nëngrup i llojit int.

Operatori

Rezultati

Operatori

Rezultati

Shtimi

shtesë me detyrë

zbritja (gjithashtu unar minus)

zbritje me detyrë

Shumëzimi

shumëzim me detyrë

ndarja me detyrë

modul

modul me detyrë

Rritje

pakësim

Katër veprime aritmetike

Më poshtë është një program i thjeshtë që demonstron përdorimin e operatorëve si shembull. Vini re se operatorët punojnë në literale me numra të plotë dhe në ndryshore.

klasa BasicMath( zbrazëti statike publike int a = 1 + 1;

intb = a*3;

kryesore (args me vargje) (

int c = b / 4;

int d \u003d b - a;

int e = -d;

System.out.println("a = +a);

System.out.println("b = +b);

System.out.println("c = +c);

System.out.println("d = +d);

System.out.println("e =" +e);

} }

Kur ekzekutoni këtë program, duhet të merrni daljen e mëposhtme:

C:\>java BasicMath

a = 2

b = 6

c = 1

d=4

e = -4

Operatori i modulit

Operatori modul, ose operatori mod, shënohet me simbolin %. Ky operator kthen pjesën e mbetur pas pjesëtimit të operandit të parë me të dytin. Ndryshe nga C++, funksioni mod i Java-s funksionon jo vetëm me numra të plotë, por edhe me lloje reale. Programi më poshtë ilustron funksionimin e këtij operatori.

moduli i klasës (

zbrazëti publike statike kryesore (Stringargs ) {

int x = 42;

dyfishi y = 42,3;

System.out.println("x mod 10 = " + x % 10);

System.out.println("y mod 10 = " + y % 10);

} }

Kur ekzekutoni këtë program, do të merrni rezultatin e mëposhtëm:

C:\>Moduli

x mod 10 = 2

y mod 10 = 2.3

Operatorët e caktimit aritmetik

Për secilën prej operatorët aritmetikë ekziston një formë në të cilën një detyrë kryhet njëkohësisht me një operacion të caktuar. Më poshtë është një shembull që ilustron përdorimin e këtij lloji të operatorit.

klasa OpEquals(

int a = 1;

int b = 2;

int c = 3;

a += 5;

b *= 4;

c += a * b;

me %= 6;

} }

Dhe këtu është rezultati i marrë gjatë ekzekutimit të këtij programi:

C:> Java OpEquals

a = 6

b = 8

c = 3

rritje dhe zvogëlim

Ekzistojnë 2 operatorë në C, të quajtur operatorët e rritjes dhe zvogëlimit (++ dhe --), të cilët janë stenografi për të shtuar ose zbritur një nga një operand. Këta operatorë janë unik në atë që mund të përdoren në formë parashtese ose postfikse. Shembulli i mëposhtëm ilustron përdorimin e operatorëve të rritjes dhe zvogëlimit.

klasa IncDec(

boshllëk publik statik kryesor (args me vargje) (

int a = 1;

int b = 2;

int c = ++b;

int d = a++;

c++;

System.out.println("a = " + a);

System.out.println("b = " + b);

System.out.println("c = " + c);

} }

Rezultati i ekzekutimit të këtij programi do të jetë:

C:\java IncDec

a = 2

b = 3

c=4

d=1

Operatorët e bitave të plotë

Për llojet e të dhënave numerike të plota - definohet long, int, short, char dhe byte set shtesë operatorët, me të cilët mund të kontrolloni dhe modifikoni gjendjen e biteve individuale të vlerave përkatëse. Tabela ofron një përmbledhje të këtyre operatorëve. Operatorët aritmetikë të bitit punojnë me çdo bit sikur të ishte një vlerë e pavarur.

Operatori

Rezultati

Operatori

Rezultati

mohim unar bitwise (JO)

në mënyrë bitale DHE (AND)

bitwise AND (AND) me caktim

pjesërisht OSE (OR)

bit OR (OR) me caktim

OR ekskluzive bitwise (XOR)

bitwise ekskluzive OR (XOR) me caktim

zhvendosje djathtas

zhvendosje djathtas me detyrë

zhvendosja djathtas me mbushje zero

Zhvendosja djathtas me mbushje zero me caktim

zhvendosja majtas

zhvendosja majtas me detyrën

Një shembull i një programi që manipulon bit

Tabela më poshtë tregon se si secili prej operatorëve aritmetikë bit ndikon në kombinimet e mundshme të biteve të operandëve të tij. Shembulli i mëposhtëm në tabelë ilustron përdorimin e këtyre operatorëve në një program Java.

klasa Bitlogjike (

boshllëk publik statik kryesor (Args varg ) (

Binar i vargut = ( "OOOO", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001","1010", "1011 ", "1100", "1101",

"1110", "1111" };

int a = 3;//0+2+1 ose binar 0011

int b = 6;//4+2+0 ose binar 0110

int c = a | b;

int d = a&b;

int e = a^b;

int f = (~a & b) | (a & ~b);

int g = ~a & 0x0f;

System.out.println(" a = " + binare[a]);

System.out.println(" b = " + binare[b]);

System.out.println(" ab = " + binare[c]);

System.out.println(" a&b = " + binare[d]);

System.out.println(" a^b = " + binare[e]);

System.out.println("~a&b|a^~b = " + binare[f]);

System.out.println("~a = " + binare[g]);

} }

Më poshtë është rezultati i marrë nga ekzekutimi i këtij programi:

C:\>Java BitLogic

a = 0011

b=0110

a | b=0111

a&b=0010

a^b=0101

~a & b | a&~b=0101

~a = 1100

Zhvendos majtas dhe djathtas

Operatori<< выполняет сдвиг влево всех битов своего левого операнда на число позиций, заданное правым операндом. При этом часть битов в левых разрядах выходит за границы и теряется, а соответствующие правые позиции заполняются нулями. В предыдущей главе уже говорилось об автоматическом повышении типа всего выражения до int в том слу­чае если в выражении присутствуют операнды shkruani int ose lloje të plota më të vogla. Nëse të paktën një nga operandët në shprehje është i tipit long, atëherë lloji i të gjithë shprehjes promovohet në long.

Operatori >> do të thotë zhvendosje djathtas në Java. Ai i lëviz të gjitha pjesët e operandit të majtë djathtas sipas numrit të pozicioneve të përcaktuara nga operandi i djathtë.Kur bitet e operandit të majtë kalojnë pozicionin më të djathtë të fjalës, ato humbasin. Kur zhvendoset djathtas, bitet e lëshuara të larta (majtas) të numrit të zhvendosur mbushen me përmbajtjen e mëparshme të bitit të shenjës. Kjo sjellje quhet zgjerim i bitit të shenjës.

Programi i mëposhtëm konverton një vlerë bajt në një varg që përmban paraqitjen e tij heksadecimal. Ju lutemi vini re se vlera e zhvendosur duhet të maskohet, domethënë të shumëzohet logjikisht me vlerën 0 x0 f, në mënyrë që të pastrohen pjesët e mbushura si rezultat i zgjerimit të shenjës dhe të ulet vlera në kufijtë e lejuar kur indeksohet një grup shifrash heksadecimal. .

classHexByte(

char hex = ( "0", "1, "2", "3", "4", "5", "6", "7", "8", "9", "a", "b" , "c", "d", "e", "f );

byte b = (byte) 0xf1;

System.out.println(“b = 0x” + hex[(b >> 4) & 0x0f] + hex);

} }

Më poshtë është rezultati i këtij programi:

C:\>java HexByte

b = 0xf1

Zhvendosje e panënshkruar djathtas

Shpesh kërkohet që kur zhvendoset djathtas, të mos ndodhë zgjerimi i bitit të shenjës dhe bitet e mbetura të lira të mbushen thjesht me zero.

Klasa ByteUSshift(

kryesore statike e zbrazëtisë publike (args me vargje) (

char hex = ( "0", "1', "2", "3", "4", "5", "6", "7", "8", "9", "a", "b ", "c", "d", "e", "f");

byte b = (byte) 0xf1;

byte c = (byte) (b >> 4);

byte d = (byte) (b >> 4);

byte e = (byte) ((b & 0xff) >> 4);

System.out.println(" b = 0x" + hex(b >> 4) & 0x0f] + hex);

System.out.println(“ b >> 4 =0x" + hex[(c >> 4) & 0x0f] + hex);

System.out.println("b >>> 4 = 0x" + hex[(d >> 4) & 0x0f] + hex);

System.out.println(“(b & 0xff) >> 4 = 0x" + hex[(e >> 4) & 0x0f] + hex);

} }

Për këtë shembull, ndryshorja b mund të inicializohet me një numër negativ arbitrar, ne kemi përdorur një numër me një paraqitje heksadecimal prej 0xf1. Variablës c i caktohet rezultati i një zhvendosjeje të shënuar b djathtas me 4 bit. Siç pritej, zgjerimi i bitit të shenjës bën që 0xf1 të bëhet 0xff. Pastaj rezultati i një zhvendosjeje të panënshkruar b djathtas me 4 bit futet në variablin d. Dikush do të priste që d të përmbajë 0x0f, por në realitet ne marrim përsëri 0xff. Ky është rezultati i zgjerimit të bitit të shenjës që kryhet kur b u promovua automatikisht në int përpara operacionit të zhvendosjes djathtas. Së fundi, në shprehjen për variablin e, arrijmë të arrijmë rezultatin e dëshiruar - vlerën 0x0f. Për ta bërë këtë, ne duhej të shumëzonim logjikisht vlerën e ndryshores b me maskën 0xff përpara se të zhvendoseshim djathtas, duke pastruar kështu bitet e rendit të lartë të mbushura gjatë promovimit të tipit automatik. Vini re se nuk ka më nevojë për të përdorur një zhvendosje djathtas të panënshkruar, pasi ne e dimë gjendjen e bitit të shenjës pas operacionit AND.

C:\>java ByteUSshift

b = 0xf1

b >> 4 = 0xff

b >>> 4 = 0xff

b & 0xff) >> 4 = 0x0f

Operatorët e Caktimit Bitwise

Ashtu si në rastin e operatorëve aritmetikë, të gjithë operatorët binarë bitwise kanë një formë të lidhur që ju lejon të caktoni automatikisht rezultatin e operacionit në operandin e majtë. Shembulli i mëposhtëm krijon disa variabla me numra të plotë dhe kryen operacione të ndryshme mbi to duke përdorur operatorët e mësipërm.

klasa OpBitEquals(

boshllëk publik statik kryesor (args me vargje) (

int a = 1;

int b = 2;

int c = 3;

a |= 4;

b >>= 1;

nga<<= 1;

a ^= c;

System.out.println("a = " + a);

System.out.println("b = " + b);

System.out.println("c = " + c);

} }

Rezultatet e ekzekutimit të programit janë si më poshtë:

C:\>Java OpBitEquals

a = 3

b = 1

c = 6

Operatorët Relacionalë

Për të qenë në gjendje të krahasoni dy vlera, Java ka një grup operatorësh që përshkruajnë lidhjen dhe barazinë. Lista e operatorëve të tillë është dhënë në tabelë.

Operatori

Rezultati

më shumë ose të barabartë

më pak ose e barabartë me

Vlerat e çdo lloji, duke përfshirë numrat e plotë, numrat realë, karakteret, booleans dhe referencat, mund të krahasohen duke përdorur operatorin e barazisë == dhe operatorin inequality!=. Ju lutemi vini re se në Java, si dhe në C dhe C ++, kontrolli për barazi tregohet nga sekuenca (==). Një shenjë e vetme (=) është një operator caktimi.

Operatorët logjikë Boolean

Operatorët logjikë boolean, të përmbledhur në tabelën e mëposhtme, veprojnë vetëm në operandë të tipit boolean. Të gjithë operatorët logjikë binarë marrin dy vlera boolean si operandë dhe kthejnë një rezultat të të njëjtit lloj.

Operatori

Rezultati

Operatori

Rezultati

logjike DHE (DHE)

DHE (DHE) me detyrë

logjik OSE (OR)

OSE (OR) me detyrë

ekskluzive logjike OSE (XOR)

ekskluzive OSE (XOR) me detyrë

OSE operator për vlerësimin e shpejtë të shprehjeve ( qark i shkurtër OSE)

Operatori AND për vlerësimin e shpejtë të shprehjeve (qark i shkurtër DHE)

mohim logjik unar (JO)

operator tresh nëse-atëherë-tjetër

Rezultatet e veprimit të operatorëve logjikë në kombinime të ndryshme të vlerave të operandit janë paraqitur në tabelë.

Programi më poshtë pothuajse plotësisht përsërit shembullin BitLogic që tashmë e dini. Vetëm por këtë herë po punojmë me boolean boolean.

klasa BoolLogic (

boshllëk publik statik kryesor (args me vargje) (

boolean a = e vërtetë;

boolean b = false;

boolean c = a | b;

boolean d = a&b;

booleane=a^b;

boolean f = (!a & b) | (a & !b);

boolean g = !a;

System.out.println(" a = " + a);

System.out.println(" b = " + b);

System.out.println(" a|b = " + c);

System.out.println(" a&b = " + d);

System.out.println(" a^b = " + e);

System.out.println("!a&b|a&!b = " + f);

System.out.println(" !a = " + g);

} }

C:\>Java BoolLogic

a = e vërtetë

b=false

a|b = e vërtetë

a&b = e rreme

a^b = e vërtetë

!a&b|a&!b = e vërtetë

!a = e rreme

Operatorët e Vlerësimit të Shpejtë shprehjet boolean(operatorë logjikë të qarkut të shkurtër)

Ka dy shtesa interesante në grupin e operatorëve logjikë. Këto janë versione alternative të operatorëve AND dhe OR për vlerësimin e shpejtë të shprehjeve boolean. Ju e dini se nëse operandi i parë i një operatori OR është i vërtetë, atëherë pavarësisht nga vlera e operandit të dytë, rezultati i operacionit është i vërtetë. Në mënyrë të ngjashme, në rastin e operatorit AND, nëse operandi i parë është false, atëherë vlera e operandit të dytë nuk ndikon në rezultatin - do të jetë gjithmonë false. Nëse jeni duke përdorur && dhe || në vend të formave të zakonshme & dhe |, Java nuk vlerëson operandin e duhur të një shprehjeje boolean nëse përgjigja është e qartë nga vlera e operandit të majtë. Praktika e zakonshme është përdorimi i && dhe || pothuajse në të gjitha rastet, vlerësimi i shprehjeve logjike boolean. Versionet e këtyre operatorëve & dhe | zbatohen vetëm për aritmetikën bit.

Operatori tresh nëse-atëher-tjetër

Forma e përgjithshme e deklaratës if-then-use është:

shprehja 1? shprehja2: shprehja3

Si operand i parë - "shprehje1" - mund të përdoret çdo shprehje, rezultati i së cilës është një vlerë boolean. Nëse rezultati është i vërtetë, atëherë ekzekutohet deklarata e dhënë nga operandi i dytë, domethënë "shprehja2". Nëse operandi i parë është false, atëherë ekzekutohet operandi i tretë - "shprehja3". Operandi i dytë dhe i tretë, d.m.th., shprehja 2 dhe shprehja 3, duhet të kthejnë vlera të të njëjtit lloj dhe nuk duhet të jenë të tipit void.

Programi më poshtë përdor këtë operator për të kontrolluar pjesëtuesin përpara se të kryejë operacionin e ndarjes. Në rastin e një pjesëtuesi zero, vlera 0 kthehet.

klasa treshe (

boshllëk publik statik kryesor (args me vargje) (

int a = 42;

int b = 2;

int c = 99;

int d = 0;

int e = (b == 0) ? 0: (a/b);

int f = (d == 0) ? 0: (c/d);

System.out.println("a = " + a);

System.out.println("b = " + b);

System.out.println("c = " + c);

System.out.println("d = " + d);

System.out.println("a / b = " + e);

System.out.println("c / d = " + f);

} }

Ky program nuk hedh një përjashtim pjesëtimi me zero dhe prodhon rezultatet e mëposhtme:

C:\>java treshe

a = 42

b = 2

c = 99

d=0

a/b=21

c/d= 0

Përparësia e operatorit

Java ka një renditje ose përparësi specifike të operacioneve. Në algjebrën elementare, na mësuan se shumëzimi dhe pjesëtimi kanë përparësi më të madhe se mbledhja dhe zbritja. Në programim, ju gjithashtu duhet të mbani gjurmët e prioriteteve të operacioneve. Tabela liston, në rend zbritës, përparësinë e të gjitha operacioneve të gjuhës Java.

Rreshti i parë i tabelës përmban tre operatorë të pazakontë që nuk i kemi diskutuar ende. Kllapat () përdoren për të vendosur në mënyrë të qartë përparësinë. Siç mësuat në kapitullin e mëparshëm, kllapat katrore përdoren për të indeksuar një variabël vargu. Operatori. (pika) përdoret për të ndarë elementët nga një referencë objekti - do të flasim për këtë në Kapitullin 7. Të gjithë operatorët e tjerë tashmë janë diskutuar në këtë kapitull.

Prioritete të qarta

Meqenëse prioriteti më i lartë është kllapa të rrumbullakëta, gjithmonë mund të shtoni disa palë kllapa në një shprehje nëse keni dyshime për rendin e vlerësimit ose thjesht dëshironi ta bëni kodin tuaj më të lexueshëm.

a >> b + 3

Cila nga dy shprehjet, a >> (b + 3) ose (a >> b) + 3, përputhet me rreshtin e parë? Meqenëse operatori i mbledhjes ka përparësi më të lartë se operatori i ndërrimit, përgjigja e saktë është a>> (b + por). Pra, nëse ju duhet të kryeni një operacion (a>>b )+ 3 kllapat janë të domosdoshme.

Pra, ne kemi shqyrtuar të gjitha llojet e operatorëve të gjuhës Java. Tani mund të ndërtoni çdo shprehje nga lloje të ndryshme të dhëna. Në kapitullin tjetër, do të mësojmë rreth konstrukteve të degëzimit, looping dhe si të kontrollohet ekzekutimi i programit.

Operatorët logjikë punojnë vetëm me operandët e tipit logjike. Të gjithë operatorët logjikë me dy operandë kombinojnë dy vlera logjike për të formuar vlerën logjike që rezulton. Mos e ngatërroni me.

Tabela e operatorëve logjikë në Java

Operatorët logjikë & , | , ^ veprojnë në vlerat e llojit logjike në të njëjtën mënyrë si në lidhje me bitet e vlerave të numrave të plotë. Operatori Boolean ! përmbys (përmbys) një gjendje boolean: !e vërtetë == e rreme Dhe !false == e vertete.

Tabela. Rezultatet e ekzekutimit të operatorëve logjikë

ABA | BA&BA^B!A
i rremëi rremëi rremëi rremëi rremëe vërtetë
e vërtetëi rremëe vërtetëi rremëe vërtetëi rremë
i rremëe vërtetëe vërtetëi rremëe vërtetëe vërtetë
e vërtetëe vërtetëe vërtetëe vërtetëi rremëi rremë

Shkurtorja e Operatorëve Boolean

Përveç operatorëve standardë DHE (&) Dhe OSE (|) ka shkurtore && Dhe || .

Nëse shikoni tabelën, mund të shihni se rezultati i ekzekutimit të operatorit OSE barazohet e vërtetë e vërtetë, pavarësisht nga vlera e operandit B. Në mënyrë të ngjashme, rezultati i ekzekutimit të operatorit DHE barazohet i rremë kur vlera e operandit A është i rremë, pavarësisht nga vlera e operandit B. Rezulton se nuk kemi nevojë të llogarisim vlerën e operandit të dytë nëse rezultati tashmë mund të përcaktohet nga operandi i parë. Kjo bëhet e përshtatshme në rastet kur vlera e operandit të djathtë varet nga vlera e të majtës.

Merrni parasysh shembulli tjetër. Supozoni se kemi futur një rregull - të ushqejmë ose jo macen, në varësi të numrit të minjve të kapur në javë. Për më tepër, numri i minjve varet nga pesha e maces. Sa më e madhe të jetë macja, aq më shumë minj duhet të kapë.

Macja, e cila lexoi gjendjen e problemit, u ofendua nga unë. Ai tha se isha prapa kohës, dhe në oborrin e shekullit të 21-të - minjtë mund të kapen me kurthe miu. Më duhej t'i shpjegoja se ky është vetëm një problem, dhe jo një shembull nga jeta e tij personale.

intmouse; // numri i minjve në peshë; // pesha e maces në gram miu = 5; pesha = 4500; nëse (miu != 0 & pesha / miu< 1000) { mInfoTextView.setText("Можно кормить кота"); }

Nëse e drejtoni programin, shembulli do të funksionojë pa probleme - pesë minj në javë janë të mjaftueshme për ta trajtuar macen me një mëngjes të shijshëm. Nëse ai kap katër minj, atëherë problemet do të fillojnë me ushqimin e maces, por jo me programin - do të funksionojë, thjesht nuk do të shfaqë një mesazh në lidhje me lejen për të ushqyer parazitin.

Tani le të marrim një rast ekstrem. Macja u përta dhe nuk kapi asnjë mi. Vlera e ndryshueshme miun do të jetë e barabartë me 0, dhe ka një operator ndarjeje në shprehje. Por ju nuk mund të ndani me 0 dhe programi ynë do të mbyllet me një gabim. Duket se ne kemi dhënë opsionin me 0, por Java vlerëson të dyja shprehjet miu != 0 Dhe pesha / miu< 1000 , pavarësisht se tashmë në shprehjen e parë kthehet i rremë.

Le ta rishkruajmë kushtin si më poshtë (shtoni vetëm një karakter):

Nëse (miu != 0 && pesha / miu< 1000) { mInfoTextView.setText("Можно кормить кота"); }

Tani programi funksionon pa përplasje. Pasi Java pa që shprehja e parë u kthye i rremë, atëherë shprehja e ndarjes së dytë thjesht shpërfillet.

Operatorët e shkurtuar DHE Dhe OSE zakonisht përdoret në situatat kur kërkohen operatorë logjika boolean, dhe të afërmit e tyre me një karakter përdoren për operacione në bit.

Operator tresh

Gjuha Java ka gjithashtu një treshe të veçantë operator i kushtëzuar, i cili mund të zëvendësojë lloje të caktuara operatorët nëse-atëherë-ndrysheështë operator ?:

Operatori tresh përdor tre operandë. Shprehja është shkruar në formën e mëposhtme:

Kushti Boolean? shprehja1: shprehja2

Nëse gjendja logjike barazohet e vërtetë, atëherë llogaritet shprehje 1 dhe rezultati i tij bëhet rezultat i ekzekutimit të të gjithë deklaratës. Nëse gjendja logjike barazohet i rremë, atëherë llogaritet shprehje2, dhe vlera e tij bëhet rezultat i operatorit. Të dy operandët shprehje 1 Dhe shprehje2 duhet të kthejë një vlerë të të njëjtit lloj (ose të përputhshëm).

Konsideroni një shembull në të cilin ndryshorja absval duke i caktuar një vlerë absolute një ndryshoreje val.

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

e ndryshueshme absval do të caktohet vlera e ndryshores val nëse vlera është më e madhe ose e barabartë me zero (pjesa e dytë e shprehjes). Nëse vlera e ndryshores val është negativ, pastaj ndryshorja absval caktohet vlera e ndryshores, e marrë me shenjën minus, si rezultat, minus herë minus do të japë një plus, domethënë një vlerë pozitive. Le të rishkruajmë kodin duke përdorur nese Tjeter:

Nëse (val< 0) absval = -val; else absval = val;

Ju mund të shihni një shembull tjetër me një operator tresh.

Shumica e operacioneve në lloje primitive nuk bëhet me metoda, por me personazhe të veçanta thirrur shenjë operimi.

operacioni i caktimit

Detyrë variabli i vlerës konstante, quhet një variabël ose shprehje tjetër (ndryshore dhe/ose konstante të ndara nga shenjat e operatorit). operacioni i caktimit dhe shënohet me " = ", për shembull: x = 3 ; y = x; z = x; Në Java, është e mundur të përdoret operatori i caktimit disa herë në një shprehje, për shembull: x1 = x2 = x3 = 0 ; Ky operacion kryhet nga djathtas majtas, dmth së pari variabilit x3 i caktohet vlera 0, më pas x2 i caktohet vlera x3 (0), dhe së fundi x1 i caktohet vlera x2 (0) Shenjat e veprimeve argumentet e të cilave janë numrat ndahen në dy kategori : unare(unare) shenjat e operacionit me një argument dhe binare(binare) me dy argumente.

Operacione unare

Java përcakton operacionet unare të mëposhtme:
  • unary minus "-" - ndryshon shenjën e një numri ose shprehje në të kundërtën;
  • unary plus " + " - nuk kryen asnjë operacion në një numër ose shprehje;
  • komplementi në bit "~" (vetëm për numrat e plotë) - përmbys të gjitha bitet e fushës së numrave (ndryshon 0 në 1 dhe 1 në 0);
  • rritja " ++ " (vetëm për numrat e plotë) - rrit vlerën e ndryshores me 1;
  • zvogëlimi " -- " (vetëm për numrat e plotë) - zvogëlon vlerën e ndryshores me 1.
Shembuj operacionet unare"+" dhe "-": int i = 3 , j, k; j=-i; // j = -3 k = + i; // k = 3 Shembull i veprimit të komplementit bit: int a = 15 ; intb; b=~a; // b = -16 Numrat a dhe b janë int , d.m.th. përfaqësohen nga brenda nga kompjuteri si numra të plotë binarë të nënshkruar me gjatësi 32 bit, pra paraqitje binare numrat a dhe b do të duken kështu: a = 00000000 00000000 00000000 00001111 b = 11111111 11111111 11111111 11110000 . Paraqitja dhjetore e numrit b do të ishte -16 . Shenjat e operatorit të rritjes dhe zvogëlimit mund të vendosen para ose pas një ndryshoreje. Këto opsione quhen përkatësisht parashtesë Dhe postfiks regjistrimin e këtyre transaksioneve. Shenja e operatorit në shënimin e prefiksit kthen vlerën e operandit të tij pas vlerësimi i shprehjes. Me shënim postfiks, shenja e operacionit ne fillim kthen vlerën e operandit të tij dhe vetëm atëherë llogarit rritjen ose zvogëlimin, për shembull: int x = 1 , y, z; y=++x; z= x++ ; Variablës y do t'i caktohet vlera 2 sepse x fillimisht do të rritet me 1 dhe më pas rezultati do t'i caktohet ndryshores y. Variablës z do t'i caktohet vlera 1 sepse z fillimisht do t'i caktohet një vlerë dhe më pas x do të rritet me 1 . Në të dyja rastet, vlera e re e x do të jetë 2. Duhet të theksohet se në Java, ndryshe nga gjuha C, operacionet e zvogëlimit dhe rritjes mund të aplikohen gjithashtu për variablat realë ( tip notues dhe dyfish). Shenjat binare të operacioneve ndahen në operacione me rezultat numerik dhe operacione krahasimi, rezultati i të cilave është një vlerë Boolean.

Operacionet aritmetike binare

Java përcakton sa vijon veprime binare aritmetike:
  • shtimi "+";
  • zbritja "-";
  • shumëzimi " * ";
  • ndarja "/";
  • llogaritja e pjesës së mbetur të pjesësimit të numrave të plotë " % " (kthen pjesën e mbetur të pjesëtimit të numrit të parë me të dytin, dhe rezultati do të ketë të njëjtën shenjë si dividenti), për shembull, rezultati i operacionit 5% 3 do të jetë 2, dhe rezultati i veprimit (-7) %(-4) do të jetë i barabartë me -3. NË Operacioni Java mund të përdoret gjithashtu për variabla reale (lloji float ose double).
shembuj binare veprimet aritmetike: 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 (kur ndahen numrat e plotë // pjesë thyesore hedhur poshtë) x5 = x%4 // x5 = 3 (mbetja nga ndarja// 7 nga 4)

Operacionet bitwise

  • Operacionet bitwise konsiderojnë origjinalin vlerat numerike si fusha bit dhe kryeni veprimet e mëposhtme mbi to:
  • duke vendosur rrahjen në i-Pozicioni i fushes se rezultatit eshte 1 nese te dy bitet jane in i-Pozicionet e operandeve janë të barabarta me 1 , ose me 0 në të kundërt AND (" & ");
  • duke vendosur rrahjen në i-Pozicioni i fushës së rezultatit është 1 nëse të paktën një bit është in i Pozicioni i -të i operandëve është 1 , ose 0 përndryshe - në bit OR (" | ");
  • duke vendosur rrahjen në i Pozicioni i -të i fushës së rezultatit është 1 nëse bitet janë në i-Pozicionet e operandëve nuk janë të barabarta me njëri-tjetrin, ose me 0, përndryshe - ekskluzive OR (" ^ ");
  • zhvendosja në të majtë të pjesëve të fushës së operandit të parë nga numri i biteve të përcaktuar nga operandi i dytë (biti i shenjës së numrit nuk ndryshon në këtë rast) - zhvendosja në të majtë në të majtë, duke marrë parasysh shenjën "<< ";
  • zhvendosja në të djathtë të biteve të fushës së operandit të parë nga numri i biteve të përcaktuar nga operandi i dytë (biti i shenjës së numrit nuk ndryshon në këtë rast) - zhvendosja në të djathtë, duke marrë parasysh shenjën " >> ";
  • zhvendosja në të djathtë të biteve të fushës së operandit të parë nga numri i biteve të përcaktuar nga operandi i dytë (biti i shenjës së numrit gjithashtu zhvendoset në këtë rast) - zhvendosja djathtas në bit pa marrë parasysh ">>>" shenjë.
Shembuj të operacioneve bitwise:
  1. Bitwise DHE

    int x = 112; int y = 94; intz; z=x & y; // z=80: 00000000 00000000 00000000 01010000
  2. Në mënyrë bitale OSE

    int x = 112; // x: 00000000 00000000 00000000 01110000 int y = 94; // y: 00000000 00000000 00000000 01011110 intz; z=x | y; // z = 126: 00000000 00000000 00000000 01111110
  3. XOR në bit

    int x = 112; // x: 00000000 00000000 00000000 01110000 int y = 94; // y: 00000000 00000000 00000000 01011110 intz; z=x^y; // z = 46: 00000000 00000000 00000000 00101110
  4. Zhvendosja majtas me shenjë

    int x = 31, z; // x: 00000000 00000000 00000000 00011111 z=x<< 2 ; // z = 124: 00000000 00000000 00000000 01111100
  5. Zhvendosja djathtas me shenjë

    int x = - 17, z; z = x >> 2 ; // z = -5: 11111111 11111111 11111111 11111011
  6. Zhvendos djathtas pa shenjë

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

Operacione të kombinuara

Në Java, për operacione aritmetike binare, mund të përdorni të kombinuara Shenjat e operacionit (të përbëra): identifikuesi i operacionit = shprehja Kjo është ekuivalente me veprimin e mëposhtëm: identifikues = shprehje identifikuese e operacionit Shembuj:
  1. Shprehja x += b do të thotë x = x + b.
  2. Shprehja x -= b do të thotë x = x - b.
  3. Shprehja x *= b do të thotë x = x * b.
  4. Shprehja x /= b do të thotë x = x / b.
  5. Shprehja x %= b do të thotë x = x % b.
  6. Shprehja x &= b do të thotë x = x & b.
  7. Shprehja x |= b do të thotë x = x | b.
  8. Shprehja x ^= b do të thotë x = x ^ b.
  9. Shprehja x<<= b означает x = x << b .
  10. Shprehja x >>= b do të thotë x = x >> b.
  11. Shprehja x >>>= b do të thotë x = x >>> b.

Operacionet e krahasimit

Java përcakton operatorët e mëposhtëm krahasimi:
  • " == " (e barabartë), " != " (jo e barabartë),
  • " > " (më e madhe se), " >= " (më e madhe se ose e barabartë me),
  • " < " (меньше) " <= " (меньше или равно)
kanë dy operandë dhe kthejnë një vlerë boolean që korrespondon me rezultatin e krahasimit ( i rremë ose e vërtetë). Vini re se kur krahasoni dy vlera për barazinë në Java, si në C dhe C++, simbolet " == " (dy shenja të njëpasnjëshme të barabarta pa hapësirë), në krahasim me operatorin e caktimit, i cili përdor karakterin " = ". Përdorimi i simbolit "=" kur krahasoni dy vlera ose shkakton një gabim në kohën e përpilimit ose prodhon një rezultat të pasaktë. Shembuj të operacioneve të krahasimit: boolean është e barabartë, nuk është e barabartë, është më e madhe, është më e madheOrE barabartë, është më e vogël, është më pakOrE barabartë; int x1 = 5, x2 = 5, x3 = 3, x4 = 7; është e barabartë = x1 == x2; // është e barabartë = e vërtetë nuk është e barabartë = x1 != x2; // nuk është e barabartë = false është më e madhe = x1 > x3; // është më i madh = i vërtetë // është më i madh ose i barabartë = i vërtetë është më i madh ose i barabartë = x2 >= x3; është më pak = x3< x1; // isLess = true isLessOrEqual = x1 <= x3; // isLessOrEqual = false

operacionet boolean

operacionet boolean kryhen në variablat boolean dhe rezultati i tyre është gjithashtu një vlerë e tipit logjike. Java përcakton operacionet boolean të mëposhtme:
  • mohim "!" – zëvendësimi i fals me të vërtetën, ose anasjelltas;
  • operatori AND "&" – rezultati është i vërtetë vetëm nëse të dy operandët janë true, përndryshe rezultati është false;
  • OSE operacion " | " - rezultati është i vërtetë vetëm nëse të paktën një nga operandët është i vërtetë , përndryshe rezultati është i rremë .
  • Operatori XOR "^" - rezultati është i vërtetë vetëm nëse operandët nuk janë të barabartë me njëri-tjetrin, përndryshe rezultati është i rremë.
Operatorët "&", "|" dhe "^", si dhe operatorët përkatës në bit, mund të përdoren në operatorët e caktimit të përbërë: " &= ", " |= " dhe " ^= " Përveç kësaj, operacionet " =" janë të zbatueshme për operandët Boolean = " (e barabartë) dhe " != " (jo e barabartë). Siç mund ta shihni nga përkufizimi i operatorëve OR dhe AND, operacioni OR vlerësohet në true kur operandi i parë është true, pavarësisht nga vlera e operandit të dytë, dhe operacioni AND vlerësohet në false kur operandi i parë është false, pavarësisht nga vlera e operandit të dytë. Java përcakton dy operatorë të tjerë Boolean: versionet e dyta të operatorëve Boolean AND dhe OR, të njohur si operatorë Boolean me qark të shkurtër: qarku i shkurtër AND " && " dhe qarku i shkurtër OR " || ". Kur përdorni këto operacione, operandi i dytë nuk do të vlerësohet fare, gjë që është e dobishme në rastet kur funksionimi i saktë i operandit të djathtë varet nga fakti nëse operandi i majtë është i vërtetë ose i gabuar. Shembuj të operacioneve boolean: boolean isInRange, isValid, isNotValid, isEqual, isNotEqual; int x = 8; isInRange = x > 0 && x< 5 ; // isInRange = false isValid = x >0 || x > 5; // isValid = e vërtetë ështëNotValid = ! eshte e vlefshme; // isNotValid = false është e barabartë = ështëInRange == është Valid; // isEqual = false // isNotEqual = e vërtetë ështëNotEqual = ështëInRange != është e vlefshme

Operacioni i kushtëzuar

Operatori i kushtëzuar shkruhet në formën shprehje-1?shprehje-2:shprehje-3 . Kjo së pari vlerëson shprehjen-1, e cila duhet të japë një vlerë Boolean, dhe më pas, nëse shprehja-1 vlerësohet në true, vlerëson dhe kthen shprehjen-2 si rezultat të operacionit, ose (nëse shprehja-1 vlerësohet në false), vlerëson dhe , shprehja-3 kthehet si rezultat i operacionit. Një shembull i një operacioni të kushtëzuar: x= n> 1 ? 0:1; Variablës x do t'i caktohet vlera 0 nëse n>1 (shprehja n>1 vlerësohet me e vërtetë) ose 1 nëse n≤1 (shprehja n>1 vlerësohet në false).

Përparësia e operacionit

Veprimet në shprehje kryhen nga e majta në të djathtë, megjithatë, sipas përparësisë së tyre. Pra veprimet e shumëzimit në shprehjen y = x + z* 5 ; do të ekzekutohet para veprimit të mbledhjes sepse operacioni i shumëzimit ka prioritet më të lartë se operacioni i mbledhjes. Prioritetet e operacioneve (sipas uljes së prioritetit) në Java janë dhënë në tabelë. një.
Kllapat rrisin përparësinë e operacioneve që ndodhen brenda tyre. Pra, nëse futni kllapa në shprehjen e mësipërme: y = (x + z) * 5 ; atëherë fillimisht do të kryhet veprimi i mbledhjes dhe më pas operacioni i shumëzimit. Ndonjëherë kllapat përdoren thjesht për ta bërë një shprehje më të lexueshme, për shembull: (x > 1 ) && (x<= 5 ) ;

Konvertimi i llojit dhe derdhja gjatë kryerjes së operacioneve

Veprimet e caktimit dhe shprehjet aritmetike mund të përdorin literale, variabla dhe shprehje të llojeve të ndryshme, për shembull: double y; bytex; y = x + 5; Ky shembull shton ndryshoren bajte x dhe literalen 5 (lloji int) dhe ia cakton rezultatin ndryshores dyfishe y. Në Java, si në gjuhën C, konvertimet e tipit në vlerësimin e shprehjeve mund të kryhen automatikisht, ose me ndihmën e një operatori tip casting. Megjithatë, rregullat për hedhjen e tipit janë disi të ndryshme nga rregullat e gjuhës C dhe në përgjithësi janë më të rrepta se në gjuhën C. Kur kryeni një operacion caktimi, konvertimi i tipit ndodh automatikisht nëse zgjerimi i transformimit(konvertimi i zgjerimit) dhe dy lloje janë të pajtueshme. Transformimet në zgjerim janë transformimet bajt® shkurt® ndër® gjatë® noton® dyfishtë. Për zgjerimin e konvertimeve, llojet numerike, duke përfshirë numrin e plotë dhe pikën lundruese, janë të pajtueshme me njëri-tjetrin. Megjithatë, llojet numerike nuk janë të pajtueshme me llojet char dhe boolean. Llojet char dhe boolean nuk janë as në përputhje me njëri-tjetrin. Gjuha Java kryen gjithashtu konvertimin automatik të tipit kur ruan një konstante të numrit të plotë literal (e cila ka tipin int si parazgjedhje) në variablat e tipit byte , short , ose long (megjithatë, nëse literali ka një vlerë jashtë diapazonit të vlerave të vlefshme për atij lloji, hidhet një mesazh gabimi: humbje e mundshme e saktësisë). Nëse konvertimi është duke u ngushtuar (konvertimi ngushtues), domethënë, konvertimi është byte ¬ i shkurtër ¬ char ¬ int ¬ i gjatë ¬ float ¬ dyfish , atëherë një konvertim i tillë mund të çojë në humbjen e saktësisë së numrit ose në shtrembërimin e tij. Prandaj, ngushtimi i konvertimeve gjeneron një diagnostikim të papajtueshmërisë së tipit kur programi kompilohet dhe skedarët e klasës nuk gjenerohen. Një mesazh i tillë do të lëshohet gjithashtu kur përpiqeni të konvertoni shprehjet e tipit byte ose short në një variabël të tipit char. Nëse ju duhet ende të kryeni konvertime të tilla, përdorni operacionin cast, i cili ka formatin e mëposhtëm: ( lloji i konvertimit) kuptimi, ku lloji i konvertimit përcakton llojin në të cilin do të konvertohet e dhëna kuptimi, për shembull, si rezultat i ekzekutimit të deklaratave: bajt x = 71 ; simboli char = (char ) x; ndryshorja e simbolit do të vendoset në "G". Nëse një vlerë me pikë lundruese i caktohet një lloji të plotë, atëherë (nëse vlera e pikës lundruese ka një pjesë të pjesshme) ndodh gjithashtu një konvertim i qartë i tipit cungim(prerje) numrat. Pra, si rezultat i ekzekutimit të operatorit int x = (int ) 77.85 ; ndryshorja x do të marrë vlerën 77 . Nëse vlera e caktuar është jashtë intervalit konvertimi i tipit , atëherë rezultati i konvertimit do të jetë pjesa e mbetur e pjesëtimit të vlerës me modulin e diapazonit të llojit të caktuar (për numrat e tipit bajt, moduli i diapazonit do të jetë 256, shkurt - 65536, për int - 4294967296 dhe për një kohë të gjatë - 18446744073709551616). Për shembull, si rezultat i ekzekutimit të deklaratës byte x = (byte ) 514 ; ndryshorja x do të marrë vlerën 2 . Kur konvertoni numra të plotë ose float në të dhëna char, konvertimi në një karakter ndodh nëse numri origjinal është midis 0 dhe 127, përndryshe karakteri vendoset në " ? ". Kur kryeni konvertime aritmetike dhe bit, të gjitha vlerat e bajtit dhe të shkurtër, si dhe vlerat char, zgjerohen në int, (ndërsa vlera numerike e kodit të karakterit përdoret në llogaritjet për char), atëherë, nëse të paktën një operand është i llojit long , lloji i shprehjes së numrit të plotë zgjerohet në long . Nëse njëri prej operandëve është i tipit float, atëherë lloji i shprehjes së plotë zgjerohet në float, dhe nëse njëri prej operandëve është i tipit double, atëherë lloji i rezultatit është i dyfishtë. Pra, nëse variablat bajt a, c; i shkurtër b; atëherë në shprehjen a + b * c - 15 L + 1,5F + 1,08 - 10; së pari, përpara se të vlerësohet a + b*c, vlerat e variablave do të zgjerohen në int, më pas, duke qenë se konstantja 15 është e llojit të gjatë, rezultati i llogaritjes do të zgjerohet shumë përpara se të zbritet. Pas kësaj, duke qenë se literali 1.5 është i tipit float , rezultati i vlerësimit të një + b*c - 15L do të zgjerohet për të notuar përpara se të shtohet në këtë literal. Përpara se të kryeni mbledhjen me numrin 1.08, rezultati i llogaritjeve të mëparshme do të zgjerohet në dyfish (pasi konstantat reale janë dyfish sipas parazgjedhjes), dhe së fundi, përpara se të kryeni mbledhjen e fundit, do të zgjerohet literali 10 (int si parazgjedhje). për të dyfishuar. Kështu, rezultati i vlerësimit të shprehjes do të jetë i tipit double . Zgjerimet automatike të tipit (veçanërisht zgjerimet e shkurtra dhe byte në int) mund të shkaktojnë gabime në kohën e kompilimit që nuk njihen mirë. Për shembull, në deklaratat: bajt x = 30 , y = 5 ; x = x + y; vlera e x dhe y do të zgjerohet në int përpara se të kryhet mbledhja, dhe më pas do të hidhet një gabim kur tentohet të caktohet rezultati i një llogaritje int në një variabël bajt. Për të shmangur këtë, duhet të përdoret konvertimi i tipit eksplicit në operatorin e dytë: x = (byte ) (x + y) ; Shprehja x + y duhet të vendoset në kllapa, sepse përparësia e veprimit cast me kllapa është më e lartë se përparësia e operatorit të mbledhjes. Meqë ra fjala, nëse operatorin e dytë e shkruajmë si: x += y; atëherë nuk do të ketë mesazh gabimi. Lidhja me të parën

1. Veprimet bazë aritmetike

Tabela e mëposhtme liston veprimet bazë aritmetike të përdorura në gjuhën Java:

Konsideroni disa rregulla për të punuar me veprime aritmetike:

  • Shprehjet vlerësohen nga e majta në të djathtë, përveç nëse shtohen kllapa ose disa operatorë kanë përparësi më të lartë.
  • Operatorët *, /, dhe % kanë përparësi ndaj + dhe -.

Shembulli 1. Veprimet aritmetike mbi vlerat e plota

Për shembull, në këtë kod, variablat a Dhe b do të ketë kuptime të ndryshme:

Klasa publike BasicIntMath ( kryesore e zbrazët statike publike (args me vargje) ( int a = 4 + 5 - 2 * 3; int b = 4 + (5 - 2) * 3; System.out.println ("a = " + a) ; System.out.println("b = " + b); ) )

Rezultati i ekzekutimit:

A = 3 b = 13

  • Operacioni unar i zbritjes ndryshon shenjën e operandit të tij të vetëm.
  • Operatori unar i mbledhjes thjesht kthen vlerën e operandit të tij. Në parim, nuk është e nevojshme, por e mundur.

Shembulli 2. Veprimet unare të mbledhjes dhe zbritjes

klasa publike UnarySignOperation (publike statike void main(String args) ( double a = -6; double b = +6; System.out.println(a); System.out.println(b); ) )
  • Kur një operacion ndarjeje kryhet në një lloj të dhënash me numër të plotë, rezultati i tij nuk do të përmbajë një komponent të pjesshëm.

Shembulli 3. Pjestimi i numrave të plotë

Klasa publike IntDivision ( kryesore e zbrazët statike publike (args me varg) ( int a = 16 / 5; System.out.println (a); ) )

Rezultati i ekzekutimit të këtij programi:

  • Operandët aritmetikë duhet të jenë të tipit numerik. Veprimet aritmetike nuk mund të kryhen në llojet e të dhënave boolean, por lejohen në llojet e të dhënave karakter, sepse në Java ky lloj është në thelb një lloj tipi ndër.

Shembulli 4. Veprimet aritmetike mbi variablat e tipit karakter

klasa publike BasicCharMath1 ( kryesore e zbrazët statike publike (args me varg) ( char c = "n"; System.out.println(c); System.out.println (c + 1); System.out.println (c / 5) ;))

Rezultati i ekzekutimit:

N 111 22

Shembulli 5. Veprimet aritmetike mbi variablat e tipit karakter

klasa publike BasicCharMath2 ( kryesore e zbrazët statike publike (args me varg) ( char c1 = "1"; char c2 = "\u0031"; char c3 = 49; System.out.println(c1 + c2 + c3); ) )

Rezultati i ekzekutimit:

    Operatori i modulit shënohet me simbolin %. Ky operator kthen pjesën e mbetur pas pjesëtimit të numrit të parë me të dytin. Kur ndahet një numër i plotë, rezultati është gjithashtu një numër i plotë.

Shembulli 6. Ndarja e modulit

klasa publike DivisionByModule ( kryesore e zbrazët statike publike (args varg) ( int a = 6 % 5; double b = 6,2 % 5,0; System.out.println (a); System.out.println (b); ) )

Rezultati i ekzekutimit:

1 1.2000000000000002

2. Veprime aritmetike të përbëra me detyrë

Java ka operatorë të veçantë që kombinojnë aritmetikën me caktimin. Merrni parasysh shprehjen e mëposhtme:

A = a + 4;

Në Java, ky operacion mund të shkruhet si më poshtë:

A += 4;

Operacionet e caktimit të kompleksit jo vetëm që zvogëlojnë sasinë e kodit, por gjithashtu lejojnë konvertimin automatik që nuk e bëjnë operacionet e rregullta.

Shembulli 5. Veprimet aritmetike të përbëra me detyrë

klasë publike CompoundOperations ( publike statike 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); ) )

Artikujt kryesorë të lidhur