Tehtemärgid

Tehtemärgid omavad programmeerimiskeeles C suurt tähtsust. Nende abil luuakse avaldisi ja lauseid. Tehtemärgid jaotatakse ühe- ja kahekohalisteks. Ühekohalised tehtemärgid mõjutavad vaid ühe muutuja väärtust ja asuvad selle ees või järel. Järgmises tabelis näete kõiki võimalikke ühekohalisi tehtemärke.


Tehtemärk Tähendus
+ Pluss. Märgib positiivset arvu. See tehtemärk ei ole tavaliselt vajalik.
- Miinus. Märgib negatiivset arvu. Muudab tema järel seisva muutuja märki.
! Loogiline eitus. Muudab tema järel seisva (loogilise) muutuja tõeväärtust.
& Aadress. Hangib tema järel seisva muutuja mälupesa aadressi.
* Viit. Hangib tema järel seisva viida poolt määratud mälupesa sisu või määrab muutuja defineerimisel, et tegemist on viidaga.
++ Suurendamine (increment). Suurendab tema ees- või järel seisva muutuja väärtust. Kui tehtemärk ++ seisab muutuja ees, siis suurendatakse muutuja väärtust enne teiste tehete sooritamist. Kui ta aga seisab muutuja järel, siis suurendatakse muutuja väärtust alles peale teiste tehete sooritamist.
-- Vähendamine (decrement). Vähendab tema ees- või järel seisva muutuja väärtust. Kui tehtemärk -- seisab muutuja ees, siis vähendatakse muutuja väärtust enne teiste tehete sooritamist. Kui ta aga seisab muutuja järel, siis vähendatakse muutuja väärtust alles peale teiste tehete sooritamist.
~ Bitikaupa ühendkomplekt. Muudab iga 0 biti väärtuse 1-ks ja iga 1 omakorda 0-ks.

Tabel 6: Ühekohalised tehtemärgid

Kahekohaline tehtemärk ühendab vastava tehte abil kaks mingit väärtust ja loob uue väärtuse. Tabelis 7 näete kõiki tuntud kahekohalisi tehtemärke.


Tehtemärk Tähendus


Matemaatilised tehted
+ Liitmine.
- Lahutamine.
* Korrutamine.
/ Jagamine.
% Jagatise jääk (modulus)


Omistamistehted
= Omistamine. Omistab vasakul pool seisvale muutujale paremal pool seisva avaldise tulemuse. Vasakul pool peab olema muutuja, et talle saaks midagi omistada. Paremal pool võib olla avaldis. Muus osas on omistamine päris harilik tehe. Te võite ühes lauses teostada mitu omistamist. Näiteks: a = b + (c = d - 34);
+= Summa omistamine. Suurendab vasakul pool seisva muutuja väärtust paremal pool seisva avaldise väärtuse võrra.
-= Vahe omistamine. Vähendab vasakul pool seisva muutuja väärtust paremal pool seisva avaldise väärtuse võrra.
*= Korrutise omistamine. Korrutab vasakul pool seisva muutuja väärtuse paremal pool seisva avaldise väärtusega ja omistab tulemuse uuesti vasakul pool seisvale muutujale.

/= Jagatise omistamine. Jagab vasakul pool seisva muutuja väärtuse paremal pool seisva avaldise väärtusega ja omistab tulemuse uuesti vasakul pool seisvale muutujale.
%= Jagatise jäägi omistamine. Jagab vasakul pool seisva muutuja väärtuse paremal pool seisva avaldise väärtusega ja omistab jagatise jäägi vasakul pool seisvale muutujale.
&= Bitikaupa loogilise JA omistamine. Ühendab vasakul pool seisva muutuja bitid ühekaupa loogilise JA (AND) abil paremal pool seisva avaldise väärtuse bittidega ja omistab tulemuse uuesti vasakul pool seisvale muutujale.
|= Bitikaupa loogilise VÕI omistamine. Ühendab vasakul pool seisva muutuja bitid ühekaupa loogilise VÕI (OR) abil paremal pool seisva avaldise väärtuse bittidega ja omistab tulemuse uuesti vasakul pool seisvale muutujale.
^= Bitikaupa loogilise XOR omistamine. Ühendab vasakul pool seisva muutuja bitid ühekaupa loogilise XOR abil paremal pool seisva avaldise väärtuse bittidega ja omistab tulemuse uuesti vasakul pool seisvale muutujale.
<<= Bitikaupa vasakule poole nihutatud väärtuse omistamine. Nihutab vasakul pool seisva muutuja bitte paremal pool seisva avaldise väärtuse võrra kohti vasakule ja omistab tulemuse uuesti vasakul pool seisvale muutujale. Täisarvu nihutamine ühe koha võrra vasakule on võrdne tema korrutamisega kahega, toimub aga palju kiiremini.
>>= Bitikaupa paremale poole nihutatud väärtuse omistamine. Nihutab vasakul pool seisva muutuja bitte paremal pool seisva avaldise väärtuse võrra kohti paremale ja omistab tulemuse uuesti vasakul pool seisvale muutujale. Täisarvu nihutamine ühe koha võrra paremale on võrdne tema jagamisega kahega, toimub aga palju kiiremini.


Loogilised tehted
&& Loogiline JA (AND).
|| Loogiline VÕI (OR).


Võrdlustehted
== Võrdne
!= Mittevõrdne
< Väikesem
> Suurem
<= Väikesem või võrdne
>= Suurem või võrdne


Tehted eraldi bittidega
<< Vasakule poole nihutamine.
>> Paremale poole nihutamine.
& Bitikaupa loogiline AND
| Bitikaupa loogiline OR
^ Bitikaupa loogiline XOR


Andmestruktuuride osade kasutamine
. Andmestruktuuri (struct) elemendi väärtus.
-> Välja kasutamine andmestruktuurile osutava viida abil.


Tingimus
a ? b : c Kui avaldise a väärtus on tõene, siis arvutatakse avaldise b väärtus, vastasel juhul avaldise c väärtus.


Koma
, Eraldab kahte avaldist, mis ei ole üksteisega seotud. Selle märgi abil on võimalik sisestada kahte või enamat lauset kohta, kus on lubatud vaid üks. Laused täidetakse üksteise järel vasakult paremale.

Tabel 7 Kahekohalised tehtemärgid

Tehtemärgid omavad erinevat prioriteeti. Korrutamine on kõrgema prioriteediga kui liitmine ja seda arvestatakse ka valemite väärtuste arvutamisel. Ümarsulgudega saab tehete järjekorda muuta. Sama prioriteediga tehete puhul sooritatakse tehted vasakult paremale.

Lisaks sellele omavad tehtemärgid assotsiatiivsust (associativity). Vastavalt assotsiatiivsusele täidetakse antud tehe kas suunas vasakult paremale või paremalt vasakule. Tabelis 8 näete tehtemärkide prioriteete ja assotsiatiivsust. Tabelis esimesel real asuvad tehtemärgid omavad kõrgeimat prioriteeti. Selle järgnevad teisel real asuvad tehtemärgid jne. Viimasel real asuvad tehtemärgid on kõige madalama prioriteediga.


Tehtemärgid Assotsiatiivsus
() [] -> . Vasakult paremale
! ~ ++ -- + Paremalt vasakule
- * & (tüübi konverteerimine) sizeof Paremalt vasakule
* / % Vasakult paremale
+ - Vsakult paremale
<< >> Vasakult paremale
< <= > >= Vasakult paremale
== != Vasakult paremale
& Vasakult paremale
^ Vasakult paremale
| Vasakult paremale
&& Vasakult paremale
|| Vasakult paremale
?: Paremalt vasakule
= += -= *= /= %= Paremalt vasakule
&= ^= |= <<= >>= Vasakult paremale

Tabel 8 Tehtemärkide prioriteet ja assotsiatiivsus

Operaatori (<uus tüüp>) abil on võimalik küll avaldise tüüpi konverteerida, kuid see pole alati vajalik. Sarnaseid tüüpe oskab translaator ka ise konverteerida. Suuruselt väikesema andmetüübi konverteerimisel täpsemaks tüübiks ei teki probleeme. Liigsed baidid täidetakse vastavalt väärtuse märgile kas nullide või ühtedega. Täpsema väärtuse konverteerimisel vähemtäpsemaks võib aga tekkida probleeme, kuna osa saavutatud täpsusest läheb kaduma. Sel puhul väljastab translaator tavaliselt hoiatuse.

Matemaatiliste tehete puhul konverteeritakse väiksemad tüübid nagu char, short ja enum kõigepealt tüübiks int ja sooritatakse seejärel antud tehe. Kui tehe seob kahte erinevast tüübist väärtust, siis konverteeritakse kõigepealt ebatäpsem tüüp täpsemaks ja sooritatakse seejärel tehe. Tulemuse tüüp langeb kokku täpsema tüübiga. Näiteks täisarvu ja murdarvu korrutamisel konverteeritakse täisarv murdarvuks ja seejärel korrutatakse. Kui üks väärtustest on tüübist long double ja teine tüübist double, siis konverteeritakse viimane enne tehte sooritamist tüüpi long double.