← Natrag

Operatori

Za neke operacije se koristi isti simbol. Tada se koristi kontekst:

 int a = 3, b, c;
 b = a - 5;
 c = -a;

Unarni i binarni minus rade različite operacije, a kompajler ih razlikuje po kontekstu (broju operatora, prefix, sufix, …)

Bitovni operatori

Pristupamo do pojedinog bita ili grupe bitova

npr. kako pohraniti 32 logičke vrijednosti uz najmanji mogući trošak prostora?

bool podaci[32];
podaci[0] = true;
podaci[1] = false;
...

Ovo rješenje troši 32 bita za svaki podatak.

Drugo rješenje je:

char podaci[32];
podaci[0] = 1;
podaci[1] = 0;
...

Ovo rješenje troši 8 bita za svaki podatak, ali zbog načina na koji procesor sprema vrijednosti uglavnom će to i dalje biti 32bita.

Najbolje rješenje je:

unsigned int podaci = 0xA0532468;
...

Ovo rješenje troši 1 bit za svaki podatak.

Problem je njima sada pristupiti. \Rightarrow bitovni operatori

AND

int a = 3, b = 7, c;
c = a && b; // c = 3
...

OR

int a = 3, b = 7, c;
c = a || b; // c = 7
...

XOR

int a = 3, b = 7, c;
c = a ^ b; // c = 4
...

NOT

int a = 2, c;
c = ~a; // c = 5
...

Pomak bitova (bit shift)

Pomiče bitove varijable u lijevo ili desno za dani broj bitova.

int a = 0b0001, c; // a = 1
c = a << 1; // c = 2 tj. 0b0010
unsigned int a = 0b0100, c; // a = 4
c = a >> 1; // c = 2 tj. 0b0010

Ako se bitovi pomaknu van duljine tipa podatka, oni se brišu.

Postavljanje pojedinačnog bita

Postavljanje bita br_bita u jedinicu:

a = a | (0x1 << br_bita);

Postavljanje bita br_bita u nulu:

a = a & ~(0x1 << br_bita);

Postavljanje pojedinačnog bita

Čitanje bita br_bita:

printf("%d", a >> br_bita & 0x1);

Operatori uvećanja i umanjena za 1

Prefiksni

int a = 5, b = 10, c;
c = ++a * b; // c = 60, a = 6

Postfiksni

int a = 5, b = 10, c;
c = a++ * b; // c = 50, a = 6

Ternarni operator

rezultat = izraz ? ako_true : ako_false;

rezultat će biti vrijednost ako_true samo kada je izraz istinit, a inače će biti ako_false.

Kod:

if (x >= 0) {
  rezultat = 14;
} else {
  rezultat = 7;
}

zapisan pomoću ternarnog operatora je:

rezultat = (x >= 0) ? 14 : 7;

Demo zadatak

Kako bi smo poslali sliku s 4b bojama preko nekog “skupog” komunikacijskog kanala?

Napiši program koji:

// Rješenje zadatka
Caution

Napisati programski kod zadatka

Skraćena evaluacija

if (true || ...)

Uvijek će se biti istina te se ostali izrazi (…) neće testirati.

if (false && ...)

Uvijek će se biti laž te se ostali izrazi (…) neće testirati.

Složeni izrazi

izraz1 = izraz1 + izraz2;

ekvivalentno je:

izraz1 += izraz2;

Ovo vrijedi za sve binarne operatore.

sizeof(x)

vraća zauzeće memorije varijable x u bajtovima.

Operator zarez

Opći oblik:

rj = izraz1, izraz2;

izraz1 i izraz2 je evaluiraju, ali samo se izraz2 sprema u varijablu