C-keele operaatorite prioriteetsus ja kasutus – Praktiline juhend algajatele

1. Sissejuhatus

C-keele operaatorite prioriteetsus on oluline, et mõista programmi tööd õigesti ja saada soovitud tulemusi. Eriti juhul, kui operaatorite hindamise järjekord on valesti mõistetud, võivad tekkida ootamatud tulemused või vead. Selles artiklis selgitatakse põhjalikult C-keele peamiste operaatorite prioriteetsust ja sidumisreegleid ning tuuakse konkreetseid näiteid, et paremini aru saada.

2. Operaatorite tüübid ja põhiline kasutus

2.1 Aritmeetilised operaatorid

Aritmeetilised operaatorid on põhielemendid arvutuste tegemiseks. Neid kasutatakse programmides sageli, seega on oluline põhitõed hästi selgeks saada.

  • + (liitmine): Liidab kaks arvu.
  • - (lahutamine): Lahutab ühe arvu teisest.
  • * (korrutamine): Korrutab kaks arvu.
  • / (jagamine): Jagab ühe arvu teisega (täisarvude jagamisel jäetakse komaosa ära).
  • % (jääk): Leiab jagamise jäägi.

Näide:

int a = 10, b = 3;
int sum = a + b;  // 13
int diff = a - b; // 7
int prod = a * b; // 30
int quot = a / b; // 3
int rem = a % b;  // 1

2.2 Võrdlusoperaatorid

Võrdlusoperaatorid võrdlevad kahte väärtust ja tagastavad tõene (1) või väär (0). Neid kasutatakse sageli tingimuslausetes ja tsüklites.

  • > (suurem kui): Tõene, kui vasakpoolne väärtus on paremast suurem.
  • < (väiksem kui): Tõene, kui vasakpoolne väärtus on paremast väiksem.
  • >= (suurem või võrdne): Tõene, kui vasakpoolne väärtus on paremast suurem või võrdne.
  • <= (väiksem või võrdne): Tõene, kui vasakpoolne väärtus on paremast väiksem või võrdne.
  • == (võrdne): Tõene, kui väärtused on võrdsed.
  • != (mitte võrdne): Tõene, kui väärtused ei ole võrdsed.
int a = 5, b = 10;
if (a < b) {
    printf("a on väiksem kui b
");  // Kuvatakse
}

 

3. Operaatorite prioriteetsus ja sidumisreeglid

3.1 Operaatorite prioriteetsus

Operaatorite prioriteetsus määrab, millist operaatorit hinnatakse esimesena, kui avaldises on mitu operaatorit. Allpool on osa C-keele operaatorite prioriteetsuse tabelist, järjestatud kõrgema prioriteediga operaatoritest madalamate suunas.

PrioriteetOperaatorSelgitus
1() [] -> .Funktsiooni väljakutsed, massiivi indeksid, osutajaliikmed
2++ --Postfikssed inkrement/dekrement
3++ --Prefikssed inkrement/dekrement, märgioperaatorid
4* / %Korrutamine, jagamine, jääk
5+ -Liitmine, lahutamine
6<< >>Biti nihked
7< <= > >=Võrdlusoperaatorid
8== !=Võrdsus, mitte võrdsus
9&Biti-AND
10^Biti-XOR
11|Biti-OR
12&&Loogiline JA (AND)
13||Loogiline VÕI (OR)
14? :Tingimusoperaator
15= += -=Määramine, kombineeritud määramine
16,Komaoperaator

3.2 Sidumisreeglid

Sidumisreeglid määravad, kummast otsast samal prioriteeditasemel operaatorid hinnatakse. Enamik operaatoritest on vasakassotsiatiivsed, kuid mõned (nt määramis- ja tingimusoperaatorid) on paremassotsiatiivsed.

  • Vasakassotsiatiivne: *, +, - jt operaatorid hinnatakse vasakult paremale.
  • Paremassotsiatiivne: Määramisoperaatorid ja tingimusoperaator ? : hinnatakse paremalt vasakule.
int a = 5, b = 10, c = 15;
int result = a - b + c;  // Vasakassotsiatiivne (a - b) + c = 0

4. Teatud operaatorite prioriteedi tähelepanekud

4.1 Loogikaoperaatorid

Loogiline JA (&&) ja loogiline VÕI (||) seovad tingimuslauseid, kuid &&-l on kõrgem prioriteet kui ||-l. Seetõttu tuleb näiteks järgmises koodis olla tähelepanelik.

int a = 1, b = 0, c = 1;
if (a && b || c) {
    printf("Tõene\n");  // Kuvatakse
}

Selles näites hinnatakse kõigepealt a && b ja saadud tulemust võrreldakse c-ga loogilise VÕI kaudu. Õige hindamisjärjekorra jaoks kasuta sulgusid.

if ((a && b) || c) {
    // Selgem hindamine
}

4.2 Bititaseme operaatorid

Bititaseme operaatorid (&, |, ^) töötavad bittide kaupa, kuid neil on madalam prioriteet kui aritmeetilistel või võrdlusoperaatoritel, seega tuleb keerulisemate avaldiste puhul olla hoolikas.

int x = 5;  // 0101
int y = 3;  // 0011
int result = x & y;  // 0001 (bititaseme AND)

5. Praktiline programmi näide

Siin on näide programmist, kus operaatorite prioriteetsust on lihtne valesti mõista. Järgmises näites segatakse tihti || ja && hindamisjärjekorda.

#include <stdio.h>
int main() {
    int a = 0, b = 1;
    if (a == 0 || a == 1 && b == 0) {
        printf("Tõene\n");  // Kuvatakse
    }
    return 0;
}

Selles näites hinnatakse kõigepealt a == 1 && b == 0, kuid see võib anda ootamatu tulemuse. Õige tulemuse saamiseks kasuta sulgusid, et määrata hindamisjärjekord selgelt.

if ((a == 0 || a == 1) && b == 0) {
    printf("Tõene\n");
}

6. Kokkuvõte

C-keeles on operaatorite prioriteetsus programmi korrektsuse seisukohalt hädavajalik. Keerulisemate avaldiste puhul tuleks alati mõista prioriteetsust ja sidumisreegleid ning vajadusel kasutada sulgusid, et vältida ootamatuid vigu. Operaatorite prioriteetsuse teadlik jälgimine võimaldab kirjutada turvalisemaid ja tõhusamaid programme.

侍エンジニア塾