Operaaatorid

Aritmeetilised operaatorid

        Operaator       Tulemus
        --------------------
        +               Liitmine
        -               Lahutamine
        *               Korrutamine
        /               Jagamine
        %               Täisarvulise jagamise jääk
        ++              Inkrement (suurendamine ühe võrra)
        +=              Omistamine liitmisega
        -=              Omistamine lahutamisega
        *=              Omistamine korrutamisega
        /=              Omistamine jagamisega
        %=              Jagatise jäägi omistamine
        --              Dekrement (vähendamine ühe võrra)
            

Peamised aritmeetilised operaatorid (liitmine, lahutamine, korrutamine, jagamine) funktsioneerivad harjumuspäraselt. Operaatorit "-" võib kasutada ka unaarsena (operandi märgi muutmiseks). Näites demonstreeritakse aritmeetiliste operaatorite kasutamist. Illustreeritakse samuti erinevust täisarvude ja ujupunktarvude jagamisel.

Operaator "%" leiab täisarvulise jagamise jäägi. Teda võib kasutada nii täis- kui ujupunktarvude korral. Näide .

Aritmeetilised omistamisoperaatorid.

Aritmeetilised omistamisoperaatorid on sümbioosid omistamisest ja aritmeetilisest tehtest. Samaväärsed on operaatorid
a = a + 4;
ja
a += 4;

Nagu näha, teostatakse operandide vahel kõigepealt vastav aritmeetiline tehe ja seejärel omistatakse tulemus vasakpoolsele operandile. Võrreldes tavapärase avaldise omistamisega (a=a+4), töötavad aritmeetilised omistamisoperaatorid mõnevõrra kiiremini. Näide.

Inkrement ja dekrement.

Inkrement (++) suurendab oma operandi ühe võrra, dekrement (--) vähendab. Operaatori
x = x + 1;
võib inkrementi kasutades kirjutada ka nii
x++;
Analoogiliselt on operaator
x = x - 1;
samaväärne operaatoriga
x--;

Operaatoritel ++ ja -- on nii postfiks- kui ka prefiksvorm, st nad võivad olla kirjutatud nii operandi ette kui taha. Prefiksvormi korral toimub operandi suurendamine enne tema väärtuse kasutamist avaldise arvutamisel, postfiksvormi korral aga pärast. Näiteks
y = ++x;
on samaväärne programmilõiguga
x = x + 1;
y = x;
Teisalt,
y = x++;
on aga kirjutatav ka nii:
y = x;
x = x + 1;

Näide.

Võrdlusoperaatorid

        Operaator       Tulemus
        ------------------------
        ==              Võrdne
        !=              Mittevõrdne
        >               Suurem
        <               Väiksem
        >=              Suurem-võrdne
        <=              Väiksem-võrdne

Võrdlusoperatsioon annab loogilist (boolean) tüüpi väärtuse. Operandide võrdsust ja mittevõrdsust saab kontrollida suvalist tüüpi operandide korral (täis- ja reaalarvud, sümbolid ja tõeväärtused). Järjestusoperaatoreid (suurem, väiksem ...) saab rakendada aga vaid arvulist tüüpi operandidele.

Loogilised operaatorid.

        Operaator       Tulemus
        ----------------------------------------
        &               Loogiline JA
        |               Loogiline VÕI
        ^               Loogiline MITTESAMAVÄÄRSUS
        ||              VÕI arvutamine lühiskeemi kohaselt
        &&              JA arvutamine lühiskeemi kohaselt
        !               Loogiline unaarne eitus
        &=              Loogiline JA ning omistamine
        |=              Loogiline VÕI ning omistamine
        ==              Võrdne
        !=              Mittevõrdne
        ?:              Valikuoperaator 

Mõnede loogiliste operaatorite tõeväärtustabel

A       B       A|B     A&B     A^B     !A
------------------------------------------------
False   False   False   False   False   True
True    False   True    False   True    False
False   True    True    False   True    True
True    True    True    True    False   False

Näide

Lühiskeemi (short-circuit) kohaselt arvutatavad loogilised operaatorid.

Kui esimese operandi väärtus on true, on ka loogilise operatsiooni VÕI (|) tulemus true, sõltumata teise operandi väärtusest. Analoogiliselt on loogilise JA (&) tulemus alati false, kui esimene operand on väärtusega false. Kui operaatorite & ja | asemel kasutada operaatoreid && ja || (lühiskeemi operaatorid), siis kirjeldatud juhtudel Java ei kasutagi teist operandi (tulemus jääb ju nagunii endiseks!). Näiteks fragmendis
if (nimetaja != 0 && lugeja / nimetaja > 10)
võimaldab operaatori && kasutamine vältida nulliga jagamist teises operandis.

Toome aga ka näite, kus on tingimata vaja kasutada operaatorit &, mitte &&:
if (c==1 & e++ < 100) d = 100;
Operaatori & kasutamine garanteerib muutuja e suurendamise sõltumata sellest, kas muutuja c on võrdne ühega või mitte.

Omistamisoperaator

Üldkuju

muutuja = avaldis;

Muutuja ja avaldise tüüp peavad olema kooskõlas.

On võimalik kasutada ka omistamiste jada:

int x, y, z;
x = y = z = 100; // x, y, ja z väärtuseks saab 100.

Valikuoperaator ?

Valikuoperaatoril (ternary operator) on kolm argumenti:

avaldis1?avaldis2:avaldis3

Avaldise 1 tulemus peab olema loogilist tüüpi. Kui selle väärtus on true, on operatsiooni tulemus avaldis 2, muidu avaldis 3. Seega asendab valikuoperatsioon mõnes kontekstis if-then-else operaatorit. Näiteks fragmendis
ratio = denom == 0 ? 0 : num / denom;
kontrollitakse kõigepealt, kas muutuja denom väärtus on 0. Kui nii, saab muutuja ratio väärtuseks 0, muidu aga muutujate num ja denom jagatis. Näiteprogrammis kasutatakse valikuoperaatorit arvu absoluutväärtuse arvutamiseks.

Operaatorite prioriteet

Avaldise arvutamisel teostatakse kõigepealt kõrgema prioriteediga tehted, seejärel madalama prioriteediga. Tehete järjekorda saab muuta ümarsulgude abil. Järgneva tabeli ülareas on veel nurksulud (massiivi indekseerimise "operaator") ja punkt (objektinimede eraldamise "operaator").

kõrgeim
----------------------------------------------------
()      []      .
++      --      ~       !
*       /       %
+       -
>>      >>>     <<
>       >=      <       <=
==      !=
&
^
|
&&
||
?:
=       operaator=
----------------------------------------------------
madalaim

Ümarsulgude kasutamisest

Ümarsulud tõstavad nendesse asetatud avaldise prioriteeti. Kui on vaja leida muutujate a ja b summa ning samade muutujate vahe jagatist, tuleb soovitud tulemuse saamiseks avaldise
a + b / a - b
asemel kasutada avaldist
(a + b) / (a - b)

Esimesel juhul teostataks jagamine (/) kui kõrgema prioriteediga tehe enne kui liitmine-lahutamine ning tulemus oleks kaugel soovitust. Et aga liitmine-lahutamine saaksid tehtud enne jagamist, tuleb nende prioriteeti tõsta ümarsulgude abil nagu on ka tehtud teisel juhul.

Samuti võib ümarsulge kasutada avaldise loetavuse parandamiseks. Kumb järgnevatest avaldistest on näiteks lihtsamalt mõistetav?

a * 4 / b * c > 0 & b* 6 - c*7 <=8
((a * 4) /( b * c) > 0) & ((b* 6 - c*7) <=8)