Aritmetické výrazy

<< Premenné | Obsah | Podmienkový príkaz a logické výrazy >>

Do premenných nemusíme ukladať iba konkrétne hodnoty. Oveľa častejšie do premenných ukladáme hodnoty iných premenných a ešte častejšie výsledky nejakých výpočtov. Podobne, keď voláme metódy, ako parameter môžeme uviesť nielen konkrétnu hodnotu, názov premennej, ale aj jednoduchý výpočet hodnoty.

Najjednoduchšie numerické výpočty sa zapisujú pomocou aritmetických výrazov.

S počítaním aritmetických výrazov sa stretávame už od základnej školy. Takže iba stručné zhrnutie. Aritmetické výrazy sa vyhodnocujú podľa priority operátorov. Najvyššiu prioritu majú výrazy v zátvorkách, potom násobenia a delenia a nakoniec sčítania a odčítania. V prípade, ak je za sebou viac operátorov s rovnakou prioritou, vyhodnocujú sa z ľava do prava.

Aritmetické operácie s reálnymi číslami

Spravme si príklad, na ktorom je vidieť použitie.

double a = 6.0;
double b = 4.0;
double c;
c = a + b; // vypočítame 6.0 + 4.0 výsledok je 10.0 a ten sa vloží do premennej c
c = a - b; // vypočítame 6.0 - 4.0 výsledok je 2.0 a ten sa vloží do premennej c
         // predchádzajúca hodnota 10.0 sa nenávratne prepíše novou hodnotou 2.0
c = a * b; // vypočítame 6.0 * 4.0 výsledok je 24.0 a ten sa vloží do premennej c
c = a / b; // vypočítame 6.0 / 4.0 výsledok je 1.5 a ten sa vloží do premennej c
a = 3 * c + b / (2 + a) * 5; // na konci bude v premennej a hodnota 7

Posledný výraz sa vyhodnocuje v nasledujúcom poradí:

  • 3 * c + b / (2 + a) * 5
  • 3 * 1.5 + 4.0 / (2 + 6.0) * 5, teda dosadíme aktuálne hodnoty premenných
  • 3 * 1.5 + 4.0 / 8.0 * 5
  • 4.5 + 0.5 * 5
  • 4.5 + 2.5
  • 7.0

Takže nakoniec máme vypočítanú hodnotu výrazu 7.0, ktorá sa uloží do premennej a, čím sa nenávratne prepíše pôvodná hodnota 6.0 uložená v premennej a doteraz.

Z predchádzajúceho príkladu môžeme vidieť, že vždy sa najskôr vyhodnotí pravá strana priradenia a až po jej vyhodnotení sa ukladá výsledok do premennej na napísanej ľavo od = (rovná sa).

Čo sa týka výrazov z matematického hľadiska, zrejme ste nenašli žiadne prekvapenia a všetko fungovalo podľa predstáv.

Aritmetické operácie s celými číslami

V prípade práce s celými číslami si už treba dať väčší pozor. Príkazy sčítania, odčítania a násobenia fungujú rovnako ako pri reálnych číslach.

Pri delení dvoch celých čísiel v bežnej matematike sa často stane, že výsledok už nie je celým číslom, napríklad ak delíme 3 a 2. V Jave je výsledok delenia dvoch celých čísiel VŽDY celé číslo! Operácia sa volá celočíselné delenie. S týmto delením ste sa určite stretli na základnej škole, keď ste sa učili deliť bez použitia kalkulačky.

Príklady celočíselného delenia:

5 / 2 je 2 zvyšok 1
16 / 4 je 4 zvyšok 0
-52 / 7 je -7 zvyšok 3

Napíšme si program, ktorý nám tieto výpočty overí. Pribudne nám nový operátor %, ktorého aplikáciou získame zvyšok po delení. Tento zvyšok je tiež vždy celé číslo.

int vysledok;
int zvysok;
vysledok = 5 / 2; // priradí sa hodnota 2
zvysok = 5 % 2; //priradí sa hodnota 1
vysledok = 16 / 4; // priradí sa hodnota 4
zvysok = 16 % 4; //priradí sa hodnota 0

Ako bude fungovať náš program s premennými a, b, c po zmene typov premenných?

int a = 6;
int b = 4;
int c;
c = a + b; // vypočítame 6 + 4 výsledok je 10 a ten sa vloží do premennej c
c = a - b; // vypočítame 6 - 4 výsledok je 2 a ten sa vloží do premennej c
c = a * b; // vypočítame 6 * 4 výsledok je 24 a ten sa vloží do premennej c
c = a / b; // vypočítame 6 / 4 výsledok je 1 (zvyšok 2). teda 1 sa vloží do premennej c
a = 3 * c + b / (2 + a) * 5; // do premennej a sa priradí hodnota 3

Posledný výraz sa vyhodnocuje v nasledujúcom poradí:

  • 3 * c + b / (2 + a) * 5
  • 3 * 1 + 4 / (2 + 6) * 5, teda dosadíme aktuálne hodnoty premenných
  • 3 * 1 + 4 / 8 * 5
  • 3 + 0 * 5 (lebo 4 / 8 je 0 zvyšok 4)
  • 3 + 0
  • 3

Aritmetické operácie s celými aj reálnymi číslami

Čo sa stane, ak začneme miešať celé a reálne čísla? V nasledujúcej tabuľke si namiesto znaku $ dosaďte ľubovoľný operátor +, -, * alebo /:

typy hodnôt vo výraze typ hodnoty výsledku
int $ int int
int $ double double
double $ int double
double $ double double

Z tejto tabuľky vyplýva, že stačí aby aspoň jedna hodnota lebo premenná bola typu double a výsledok výrazu je typu double. Ukážme si to na príkladoch:

int vysledokTypuInt;
double vysledokTypuDouble;
vysledokTypuInt = 5 / 2; // priradí sa hodnota 2 (ide o celočíselné delenie)
vysledokTypuDouble = 5.0 / 2; // priradí sa hodnota 2.5
vysledokTypuDouble = 5 / 2.0; // priradí sa hodnota 2.5
vysledokTypuDouble = 5.0 / 2.0; // priradí sa hodnota 2.5
vysledokTypuDouble = 3 + 5.0 / 2; // priradí sa hodnota 3 + 2.5 teda 5.5
vysledokTypuDouble = 3.0 + 5 / 2; // priradí sa hodnota 3.0 + 2 (ide o celočíselné delenie), teda 5.0
vysledokTypuDouble = 5 / 2; // priradí sa hodnota 2 (ide o celočíselné delenie, po výpočte sa vykoná konverzia na reálne číslo 2.0)

Z predchádzajúcom príklade môžeme vidieť, že aj konkrétne hodnoty (nazývané tiež literály) majú svoj typ. Konkrétne číselné hodnoty nazývame numerické literály. Platí pravidlo, že ak numerický literál neobsahuje desatinnú čiarku (či presnejšie bodku), potom ide o celočíselnú hodnotu (podľa rozsahu, zvyčajne int). Naopak ak numerický literál obsahuje desatinnú čiarku, typ tejto hodnoty je double. Na to je dôležité myslieť najmä pri delení. Spomínate si na problém s nakreslením n-cípej hviezdy, kde n bolo 100? Problém bol spôsobený tým, že uhol natočenia sme vypočítali ako 360/n. Teraz už vieme, že numerický literál je typu int (neobsahuje desatinnú bodku) a premenná (resp. parameter) n je tiež typu int. Keďže oba operandy sú celočíselné, znamená to, že operácia / bude operáciou celočíselného delenia. Ak teda n bolo 100, tak 360/100 nebude 3.6 ale 3. My však chceme realizovať reálne delenie. Na to musí byť jeden z operandov reálne číslo. Výpočet uhla preto zapíšeme výrazom 360.0/n, ktorý nám zabezpečí aplikovanie neceločíselného delenia.

Na záver tejto podkapitoly si ešte ukážeme, ako sa vyhnúť celočíselnému deleniu aj napriek tomu, že oba operátory sú celé čísla. Musíme urobiť takzvané pretypovanie, teda násilnú konverziu jedného z celočíselných operátorov operátorov na reálne číslo. Spravíme to tak, že pred niektorý z operátorov napíšeme (double).

int a = 3;
int b = 2;
double vysledok = (double) a / b; // vypočíta sa 3.0 / 2 a priradí sa hodnota 1.5
double rovnakyVysledok = a / (double) b; // vypočíta sa 3 / 2.0 priradí sa hodnota 1.5

Aritmetické príkazy v skrátených tvaroch

Keďže programátori sú leniví, snažia sa niektoré príkazy skracovať, aby nemuseli veľa písať. Ide o príkazy, v ktorých sa na pravej strane priradenia použije stará hodnota premennej v nejakom jednoduchom aritmetickom výraze a výsledok sa zapíše opäť do tej istej premennej. Nasledujúca tabuľka vám ukáže prehľad takýchto skratiek - funguje pre celé aj reálne čísla s výnimkou operátora %, ktorý funguje iba pre celé čísla:

normálny zápis

skrátený zápis

a = a + b; a+=b;
a = a - 10; a-=10;
a = a * 5; a*=5;
a = a / 7; a/=7;
a = a % 3; a%=3;
a = a + 1; a++;
a = a - 1; a--;

<< Premenné | Obsah | Podmienkový príkaz a logické výrazy >>