Programski jezik C

Operatorji

Poznamo aritmetične, prirejevale (ki prirejajo), primerjalne (ki primerjajo), logične in bitne operatorje. V poglavju s spremenljvkami smo že spoznali operator prirejanja =.

Ker lahko v operaciji nastopajo spremenljivke različnih tipov in lastnosti, lahko pride do nekaterih sprememb tipa, kot je zapisano v nadaljevanju.

Pretvorbe tipov

Če so vse spremenljivke, udeležene v operaciji, enakega tipa, do pretvorb ne bo prišlo in bo tega tipa tudi rezultat. Izjemoma je lahko rezultat nepredznačene spremenljivke predznačen. Če sta udeležena dva različna tipa, se bo manjši tip pred operacijo pretvoril v večji tip in rezultat bo večjega tipa.

Seznam tipov po naraščajoči velikosti: char, short, int, unsigned int, long int, unsigned long int, float, double, long double.

Velja tudi; če je en tip nepredznačen (unsigned), bo tudi drugi postal tip postal nepredznačen.

Zamenjava tipov se lahko zgodi samodejno tudi pri prirejanju vrednosti ene spremenljivke v drugo spremenljivko.

int i = 42;
float j = i; /* Samodejna sprememba tipa. */

Prisilna pretvorba tipov

Operacija zamenjave tipa se lahko tudi vsili z željenim novim tipom znotraj para oklepajev, zapisanega pred imenom spremenljivke, kot je prikazano na spodnjem primeru. Ta operacija se imenuje casting.

int i = 42;
float k;
k = (float)i; /* Prisilna sprememba tipa. */ 

Pozorni moramo biti na prekoračitve zaloge vrednosti.

unsigned int i = 256;
unsigned char j = (unsigned char)i;	/* Sedaj ima j vrednost 0. */

Aritmetični operatorji

Aritmetični operatorji so operatorji, ki delujejo na množici števil in jih poznamo iz prvih razredov osnovne šole.

Nasprotna vrednost

Če je i spremenljivka, potem njeno nasprotno vrednost dobimo tako, da pred njo napišemo minus -. Ker je rezultat lahko negativen, potrebujemo za shranjevanje vrednosti predznačeno spremenljivko.

int i = 43;
int j = -i;	/* Sedaj ima j vrednost -43. */

Prištevanje in odštevanje za 1

V programu se dostikrat pojavi potreba povečati vrednost neke spremenljivke za ena. To lahko naredimo na sledeči način.

i = i + 1;

Uporaba presledkov (levo in desno od znakov za operacijo) ni nujna, vendar jih tu pišemo za doseganje boljše preglednosti. Zgornje bi lahko brez težav zapisali kot i=i+1;.

Zadnji stavek je povečal vrednost spremenljivke i za eno enoto. Jezik C nam dovoli tudi naslednji, krajši zapis zgornje operacije.

i++;

Seveda takšen zapis deluje tudi, če hočemo vrednost spremenljivke zmanjšati za 1. Uporabimo minus.

i--;

Obstajata tudi zapisa ++i in --i, ki spremenita spremenljivko i kot zgoraj. Razlika se pojavi ob uporabi v izrazu.

Prištevanje, odštevanje, množenje

Pogledali smo si, kako spremenljivko povečamo ali zmanjšamo za 1, vendar nas sedaj zanima, kako spremenljivko povečamo za neko drugo število. Nič težjega. Naslednji stavek bo povečal vrednost spremenljivke i za 5 enot.

i = i + 5;

Seveda obstaja tudi krajši zapis.

i += 5; 	/* Povečaj vrednost spr. i za 5. */

Rezultat lahko priredimo tudi drugi spremenljivki. V naslednjem primeru se bo vrednost shranila v spremenljivko j.

j = i + 6;	/* Prištej 6 k vrednosti spr. i in rezultat shrani v spr. j. */

Na voljo so nam tudi drugi operatorji: odštevanje, množenje, ki omogočajo krajši zapis.

/* prištejemo 5 */
i += 5;

/* odštejemo 5 */
i -= 5;

/* množimo s 5 */
i *= 5;

Tudi pri teh operacijah lahko rezultate shranimo v druge spremenljivke in seveda so v izračunu lahko udeležene samo spremenljivke kot kaže naslednji primer.

k = j + i;

Z oklepaji določimo vrstni red izvajanja operacij.

l = 6 * (k + 5) + p;

Zapis znaka za množenje * je obvezen, kajti prevajalnik ne ve, kaj bi lahko bilo 5 6, in bo zajamral. V tem primeru je potrebno zgornje popraviti v5 * 6.

Deljenje

Oglejmo si naslednji primer.

int i = 12;
int j = 5;

float k = i / j;

Ali lahko razjasnite čemu vrednost k ni 2,4, čeprav je ta tipa float, ki lahko hrani števila takšne oblike?

Pri deljenju, kjer so udeležena samo cela števila, torej spremenljivke številskega tipa int, ne glede na predznačenost prihaja do zaokroževanja. Vrednost spremenljivke k je tako 2, četudi je k tipa float, ki dopušča zapis s plavajočo vejico.

Zaradi te „pomankljivosti“ obstaja tudi krajši zapis deljenja, saj sedaj vemo, da bo rezultat istega tipa.

k /= 5; 

Če nočemo zaokroževanja, moramo spremenljivkam spremeniti tip v float kot kaže naslednji primer.

int i = 12;
int j = 5;

float k = (float)i / (float)j;

V zgornjem primeru je dovolj spremeniti tip ene udeležene spremenljivke: (float)i / j;, saj bo prevajalnik sam poskrbel za spremembo preostale.

Ostanek pri deljenju

Če sta oba tipa celoštevilska, lahko poiščemo tudi ostanek pri deljenju enega z drugim, kar si lahko pogledamo na naslednjem primeru.

i = 13;

/* Izračunamo odstanek pri deljenju i s 5. */
r = i % 5;

Spremenljivki r se bo določila vrednost 3, saj je ostanek pri deljenju števila 13 s številom 5 enak 3. Znak za ostanek pri deljenju je, %, znak za odstotek.

Operatorji dvojiškega številskega sistema

Med dvojiškimi števili je mogoče izvajati še nekatere druge, hitre in uporabne, operacije, ki delujejo na nivoju bitov in jih bomo spoznali v nadaljevanju.

Bitni operator ALI

Znak za bitni operator ali je navpična črta | in primerja dva bita iz dveh spremenljivk na enakem mestu ter vrne 1, če je kateri koli od omenjenih dveh bitov enak 1, oziroma 0, če sta oba bita enaka 0.

a = 0b0101;
b = 0b1001;
c = a | b;

Vrednost zgornje spremenljivke c bo 0b1101, saj imata spremenljivki a in b le bita na drugem mestu (iz desne) enaka 0.

Bitni operator IN

Znak za bitni operator in je & in primerja dva bita iz dveh spremenljivk na enakem mestu ter vrne 1, če sta oba od omenjenih dveh bitov enak 1, sicer 0.

Bitni operator XOR

Znak za bitni operator xor je ^ in primerja dva bita iz dveh spremenljivk na enakem mestu ter vrne 1, če sta oba od omenjenih dveh bitov različna, in 0, če sta enaka. Ta bitni operator je uporaben, ko hočemo spremeniti stanje posameznega bita v vrednosti spremenljivke.

Bitni operator NE

Znak za bitni operator ne (imenovan tudi eniški komplement) je ~ in obrne vsak posamezen bit v spremenljivki, torej deluje le na eni spremenljivki.

Bitni operator zamika v levo in zamika v desno

Znak za bitni operator zamika v levo (left shift) je << in znak za bitni operator zamika v desno (right shift) je >>. Kot pove že samo ime operatorja zamikata bite, torej bit na mestu 1 premakne na mesto 2, če se zamakne za 1 v levo, ali na mesto 0, če se zamakne za 1 na desno.

Prekomerno zamikanje v desno lahko privede do izgube podatkov, saj si z zamiki v levo ne moremo več povrniti bitov, ki so se zgubili pri zamikanju v desno.

Nekatere probleme lahko zelo elegantno rešimo z bitnimi zamiki. Zamik v levo za 1 predstavlja množenje z 2, zamik v levo za 2 bita predstavlja množenje s 4 in tako naprej. Podobno je pri deljenju. Zamik v desno za 1 bit predstavlja deljenje z 2, premik v desno za 2 bita pa predstavlja deljenje s 4.

Vrstni red operacij