OPERATORI U JEZIKU C
Operatori su klasifikovani prema broju operanada na:
- Unarne operatore – primenjuju se na jedan operand (npr. ++, --).
- Binarne operatore – koriste se sa dva operanda (npr. +, -, *).
- Ternarni operator – operator sa tri operanda, kao što je uslovni operator (? :).
Karakteristike operatora
- Operatori predstavljaju radnje koje se izvršavaju nad operandima, vraćajući određeni rezultat.
- Izrazi u C jeziku mogu biti složeni sastavi operanada i operatora, što omogućava formiranje složenih logičkih i matematičkih operacija.
- Operatori se primenjuju na jedan operand (kao kod unarnih operatora) ili na dva operanda (kod binarnih operatora).
- Postoji jedan operator sa tri operanda - ternarni operator (? :), koji se koristi za jednostavne uslovne izraze (objašnjen detaljno kasnije).
Pročitajte i Operatori u JAVI
int result = (a < b) ? a : b; // ternarni operator vraća 10 jer je a manje od b
Aritmetički operatori
| Operator | Upotreba | Opis |
|---|---|---|
| + | op1+op2 | Sabira op1 i op2 |
| - | op1-op2 | Oduzima op2 od op1 |
| * | op1*op2 | Množi op1 sa op2 |
| / | op1/op2 | Deli op1 sa op2 |
| % | op1%op2 | Računa ostatak deljenja op1 sa op2 |
U tabeli su dati aritmetički operatori koji se koriste u izrazima
Na primer: izračunati vrednost Re iz date jednačine: :1/Re=1/R1+1/R2
Resenje
scanf(" %lf%lf ", &R1, &R2); //Korisnik unosi R1 i R2
Re=R1*R2 / (R1+R2); // Dobijeno rešenje zadate jednačine
printf("%f",Re);
Ostatak deljenja dva broja. Operator "%"
Pretpostavimo da delimo dva cela broja: 7 i 3
Ako napišemo 7/3 dobićemo za rezultat 2. Rezultat je ceo broj jer smo delili dve celobrojne konstante
Ako želimo da dobijemo ostatak deljenja onda bi smo upotrebili operator %
7 % 3 = 1
Primer: Učitati vreme u minutama i ispisati u obliku mm:ss
scanf(" %d ", &Vr); //Korisnik unosi vreme u sekundama
/* Pretpostavimo da je korisnik uneo za vreme 132s. Pošto jedan minut ima 60s,
od ovih 132s ćemo 2*60s pretvoriti u dva minuta, a ono što preostane staviti kao sekunde, u ovom
primeru to je 132-(2*60)= 12s. Ovo računski možemo dobiti korišćenjem operatora deljenja i ostatka deljenja, "/" i "%". */
mm=Vr / 60; // mm=132/60=2
ss=Vr % 60; // mm=132%60=12
printf("%2d : %2d",mm,ss);
| Tip podatka za rezultat | Tipovi podataka za operande |
|---|---|
| long | Nijedan od operanada nije float ili double (artiemtika celih brojeva), a najmanje jedan od operatora je tipa long |
| int | Nijedan od operanada nije float ili double (aritmetika celih brojeva). Nijedan operand nije long. |
| double | Najmanje jedan operand je tipa double |
| float | Najmanje jedan operand je tipa float. Nijedan nije tipa double |
Unarni operatori "++","--"
Relacioni i uslovni operatori
| Operator | Upotreba | Vraća tačno(true) ako je |
|---|---|---|
| > | op1>op2 | op1 veće od op2 |
| >= | op1 >= op2 | op2 veće ili jednako op1 |
| < | op1 < op2 | op1 manje od op2 |
| <= | op1 <= op2 | op1 manje ili jednako op2 |
| == | op1 == op2 | op1 jednako sa op2 |
| != | op1 != op2 | op1 različito od op2 |
Primer relacionih operatora
printf("a je veće od b");
}
| Operator | Upotreba | Vraća tačno(true) ako je |
|---|---|---|
| && | op1 && op2 | i op1 i op2 imaju vrednost true. op2 se izračunava samo ako je potrebno |
| || | op1 || op2 | ili op1 ili op2 ima vrednost true (tačno). op2 se izračunava samo ako je potrebno |
| ! | !op | op ima vrednost false (netačno) |
| & | op1 & op2 | i op1 i op2 imaju vrednost tačno. Uvek se izračunava i op1 i op2 |
| | | op1 | op2 | Ili je op1 ili je op2 true (tačno). Uvek se izračunava i op1 i op2. |
| ^ | op1 ^ op2 | ako su op1 i op2 različiti, odnosno ako jedan ima vrednost true, ali ne i oba |
Logički operatori
- && - Logički AND (vraća tačno ako su oba izraza tačna).
- || - Logički OR (vraća tačno ako je barem jedan od izraza tačan).
- ! - Logički NOT (menja vrednost izraza u suprotno, tj. tačno postaje netačno i obrnuto).
Primeri logičkih operatora
bool y = false;
bool rezultat = (x && y); // rezultat je false jer oba izraza nisu tačna
Primer: Za zadate vrednosti celobrojnih promenljivih a, b, c odredi vrednosti logičkih izraza:
- a>b
- ! a > b && !(b<c)
- a !=0 || !(a>(b>c))
- a > b, daje vrednost 0,
jer 4 nije veće od 7 - ! (a > b && !(b<c)), imaće vrednost 1.
Ako zamenimo u izrazu vrednosti za a,b i c dobićemo
! ((4 > 7) && !(7<11)) = !((0) && (1)) = !(0)=1
Prikazane zagrade prikazuju kojim redom će se izvršavati operatori. Prvo se izvršavaju oni operatori koji imaju najviši prioritet(vidi poslednju tabelu dole). Dakle operatori ">" i "<" imaju viši prioritet od operatora "&&", pa se prvo izračunavaju izrazi 4>7 čija je vrednost 0(false) i 7<11 čija je vrenost 1(true). Zatim se izračunava 0 && 1 sto daje 0(false). Na kraju se izvršava negacija ! koja će ovu vrednost pretvoriti u 1(true). - a !=0 || !(a>(b>c)) daje vrednost 1
4 != 0 || (4> (7 > 11)) =
(4 != 0) || (4> (7 > 11)) =
(0) || (4> (0))=
0 || 1=
1
using namespace std;
int main()
{
int a,b,c;
bool e,f,g;
a=4;
b=7;
c=11;
//Izracunavanje logickih izraza
e=a > b;
f = !(a > b && !(b < c));
g = a!=0 || !(a > (b > c));
//Ispisivanje vrednosti izraza
cout << "e=" << e << endl;
cout << "f=" << f << endl;
cout << "g="<< g << endl;
return 0;}
Razlika između relacionih i logičkih operatora
- Relacioni operatori vrše poređenje između dve vrednosti, a rezultat poređenja je logička vrednost (tačno ili netačno). Na primer, da li je broj a veći od b.
- Logički operatori kombinuju ili negiraju logičke vrednosti. Oni ne rade direktno na numeričkim vrednostima kao relacioni operatori, već na rezultatima koji su već true ili false.
int b = 20;
int c = 15;
// Prvo koristimo relacione operatore da dobijemo booleanske vrednosti
bool uslov1 = (a < b); // true jer je 10 manje od 20
bool uslov2 = (c == 15); // true jer je c jednako 15
// Zatim koristimo logičke operatore da kombinujemo rezultate
bool konacanRezultat = uslov1 && uslov2; // true jer su oba uslova tačna
Operatori po bitovima
- operatori za izvođenje logičkih operacija između parova bitova na istim pozicijama unutar svojih operanada
- operatori za pomeranje
- ~ Vrši komplementiranje(negaciju) vrednosti svog operanda po bitovima. Dakle, vrši pretvaranje iz stanja 0 u stanje 1 i obrnuto
- & Logičko "i" za operacije po bitovima.
- | Logičko uključivo "ili" za operacije po bitovima.
- ^ Logičko isključivo "ili" za operacije po bitovima.
- << Vrši pomeranje levog operanda za onoliko binarnih mesta ulevo kolika je vrednost desnog operanda
- >> Vrši pomeranje levog operanda za onoliko binarnih mesta udesnokolika je vrednost desnog operanda. Pomeranje udesno za n pozicija ekvivalentno je deljenju broja sa 2^n
Primeri za operatore po bitovima
- 25 & 5 = 1 0000000000011001 &
0000000000000001
- 25 | 5 = 29 0000000000011001 |
0000000000011101
- 25 ^ 5 = 28 0000000000011001 ^
0000000000011100
- 25 << 2 = 100 0000000000011001 <<2 =
- 25 >> 3 = 3 0000000000011001 &
0000000000000011
Operator dodele
| Operator | Upotreba | Ekvivalentno sa: |
|---|---|---|
| += | op1 += op2 | op1 = op1 + op2 |
| -= | op1 -= op2 | op1 = op1 - op2 |
| *= | op1 *= op2 | op1 = op1 * op2 |
| /= | op1 /= op2 | op1 = op1 / op2 |
| %= | op1 %= op2 | op1 = op1 % op2 |
| &= | op1 &= op2 | op1 = op1 & op2 |
| |= | op1 |= op2 | op1 = op1 | op2 |
| ^= | op1 ^= op2 | op1 = op1 ^ op2 |
Na primer:
int N=28;
N=N<<3;
Početni broj 28 ce se transformisati u broj 224 i ta vrednost se dodeljuje istoj memoriji N.
- 28 << 3 = 224 0000000000011100 <<2 =
Ostali operatori u C, C++
Uslovni izraz: ? :
Za unete cele brojeve a i b odrediti veći broj.
Rezervišimo memoriju za 3 podatka, a i b i veći od ta dva ćemo smestiti u novu promenljivu maxAB.
int a,b,maxAB;
Korisnik zatim unosi a i b sa konzole:
scanf("%d%d", &a, &b);
Da bi dodelili vrednost maxAB , moguće su dve varijante:
maxAB=a; ako je a >=b ili
maxAB=b, ako je a<b
Ako bi stavili obe varijante, prvo bi vrednost maxAB bila a a kasnije bi se promenila u b i uvek bi na kraju bila b.
Potrebno je prvo postaviti pitanje da li je a>b, pa ako je to tačno onda se izvršava maxAB=a, u suprotnom maxAB=b;
Za to se koristi uslovni izraz:
maxAB=(a>b) ? a : b;
Na kraju treba odštampati ovu vrednost:
printf("maxAB=%d", maxAB);
SIZEOF operator
#include < stdio.h >
#include < stdlib.h >
int main(int argc, char *argv[])
{
int a;
char b;
short c;
long d;
long long e;
unsigned long int f;
printf("\nUnesi ceo broj a="); scanf("%d",&a);
printf("\nUnesi ceo broj b="); scanf("%d",&b);
printf("\nUnesi ceo broj c="); scanf("%d",&c);
printf("\nUnesi ceo broj d="); scanf("%d",&d);
printf("\nUnesi ceo broj e="); scanf("%d",&e);
printf("\nUnesi ceo broj f="); scanf("%d",&f);
printf("\nVelicina podatka int je %d bajta i to je jednako velicini a=%d bajta",sizeof(int),sizeof(a));
printf("\nVelicina podatka char je %d bajta i to je jednako velicini b=%d bajta",sizeof(char),sizeof(b));
printf("\nVelicina podatka short je %d bajta i to je jednako velicini c=%d bajta",sizeof(short),sizeof(c));
printf("\nVelicina podatka long je %d bajta i to je jednako velicini d=%d bajta",sizeof(long),sizeof(d));
printf("\nVelicina podatka long long je %d bajta i to je jednako velicini e=%d bajta",sizeof(long long),sizeof(e));
printf("\nVelicina podatka unsigned long int je %d bajta i to je jednako velicini f=%d bajta",sizeof(unsigned long int),sizeof(d));
return 0;
Operator zareza ","
Još po neki operator
| Operator | Opis operatora |
|---|---|
| [] | Indeksiranje |
| () | poziv funkcije |
| . | pristup članu(elementu) strukture |
| -> | pristup članu(elementu) strukture pomoću pokazivača |
| *(unarni) | pristup podatku pomoću pokazivača(indirektno adresiranje) |
| &(unarni) | adresa promenljive |
Tabela prioriteta operatora
Donja tabela opisuje redosled prioriteta i asocijativnost operatora u C / C ++. Prednost operatera se smanjuje od vrha do dna.
| Prioritet | Broj operanada | Smer grupisanja: | Operatori: |
|---|---|---|---|
| 15 | 2 | -> | [] () . -> |
| 14 | 1 | -> | ! ~ ++ -- + - * & (tip) sizeof |
| 13 | 2 | -> | * / % |
| 12 | 2 | -> | + - |
| 11 | 2 | -> | << >> |
| 10 | 2 | -> | < <= > >= |
| 9 | 2 | -> | == != |
| 8 | 2 | -> | & |
| 7 | 2 | -> | ^ |
| 6 | 2 | -> | | |
| 5 | 2 | -> | && |
| 4 | 2 | -> | || |
| 3 | 2 | -> | ?: |
| 2 | 2 | -> | = += -= *= /= %= &= ^= |= <<= >>= |
| 1 | 2 | -> | , |
Napredna tema — dodatni operatori i primeri
Ovaj odeljak dodaje objašnjenja za bitovne operatore, operatore dodele i kombinovane operatore,
sizeof, cast-ove i zarez operator. Kratki primeri prikazuju tipične upotrebe i uobičajene zamke.
Bitovni operatori
Bitovni operatori rade po bitovima (obično nad celobrojnim tipovima):
& (AND), | (OR), ^ (XOR), ~ (NOT),
<< (levi shift) i >> (desni shift). Često se koriste za maskiranje,
testiranje bitova i kombinovanje zastavica. Za predvidivo ponašanje kod shiftova preferiraj unsigned tipove.
// primer: maskiranje i testiranje bita
unsigned int flags = 0x5; // ...0101b
// test: da li je bit 0 postavljen?
if (flags & 0x1) { /* bit 0 je 1 */ }
// postavljanje bita 2
flags |= (1u << 2);
// čišćenje bita 0
flags &= ~(1u << 0);
// XOR za prebacivanje (toggle) selektovanih bitova
flags ^= (1u << 1);
Napomena: desni shift nad potpisanim (signed) tipovima može biti implementation-defined — koristi unsigned kada želiš predvidivo ponašanje.
Operator dodele i kombinovani operatori
Osnovni operator dodele je =. Kombinovani operatori kombinuju operaciju i dodelu:
+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=. Često sprečavaju ponavljanje imena varijable i mogu biti efikasniji.
int x = 10;
x += 5; // isto kao x = x + 5;
x &= 0xF; // maskiranje donjih 4 bita
sizeof, cast i zarez operator
sizeof vraća veličinu tipa/objekta u bajtovima. Cast koristi sintaksu (type)value.
Zarez operator , najpre evaluira levi operand, zatim desni i vraća vrednost desnog — koristan u nekim idiomima, ali smanjuje čitljivost.
int a = 0;
// ispis veličine int (koristi %zu za portabilnost)
printf("size of int: %zu\n", sizeof(int));
double d = 3.14;
int di = (int)d; // eksplicitni cast: odbacuje decimalni deo
// primer zarez operatora
int v = (a = 1, a + 2); // prvo a=1, zatim v = a+2 => v == 3
Napredna tema — logički naspram bitovnih operatora, promocije i neizdefinisano ponašanje
Razlika između logičkih i bitovnih operatora
&& i || su logički operatori: tretiraju operande kao true/false i imaju short-circuit ponašanje
(drugi operand se evaluira samo ako je potrebno). &, |, ^ su bitovni operatori: rade bit-po-bit
i uvek evaluiraju oba operanda. Ova razlika je čest izvor grešaka.
int a = 0;
int b = 1;
if (a && (b++ > 0)) {
// ovde (b++ > 0) SE NEĆE izvršiti jer a==0 -> short-circuit
}
// b ostaje 1
if (a & (b++ > 0)) {
// ovde (b++ > 0) ĆE se izvršiti; & ne short-circuit-uje
}
// b postaje 2
Integer promotions i usual arithmetic conversions (kratko)
Izrazi sa različitim celobrojnim tipovima prate pravila promocije: manji tipovi (npr. char, short) obično se promovišu u int
(ili unsigned int u nekim slučajevima). Zatim se primenjuju usual arithmetic conversions da bi se odredio zajednički tip operacije.
Mešanje signed i unsigned tipova može dati neočekivane rezultate — bolje je eksplicitno kastovati kada je namera važna.
unsigned short us = 60000;
int i = -1;
auto r = us + i;
// us se može promovisati i rezultat zavisi od pravila unsigned vs signed
Neizdefinisano ponašanje: modifikacija iste promenljive više puta u jednom izrazu
Izrazi koji modifikuju i čitaju istu promenljivu bez sekvenciranja između tih operacija imaju
undefined behavior
. Klasičan zbunjujući primer:int i = 1;
i = i++ + 1; // undefined behavior — rezultat nije definisan standardom
Piši kod eksplicitno i sekvencirano umesto ovakvih izraza:
int i = 1;
int tmp = i;
i = tmp + 1; // jasno i definisano
// ili jednostavnije forme
i++;
i = i + 1; // ili i += 1; zavisi šta želiš postići
Savet: izbegavaj složene izraze koji modifikuju istu promenljivu više puta — takvi izrazi su teško razumljivi i često neportabilni.
Konačna preporuka
Predlažem da ove sekcije postaviš kao kolapsibilne blokove ("Advanced topics") ili kao odvojene odeljke na kraju stranice, kako ne bi opteretile korisnike koji traže samo osnovne informacije. Ako želiš, mogu:
- pripremiti i englesku verziju u istom vizuelnom stilu,
- generisati kompaktni štampani cheat-sheet iz ovih sekcija,
- ili prilagoditi HTML tako da se direktno uklopi u specifičan izgled tvoje stranice — pošalji link ili CSS.
Tehnički izvori — predlozi za linkovanje
Preporučujem da u članku dodaš autoritativne reference koje čitaocima omogućavaju dublje proučavanje tema i verifikaciju tvrdnji.
Preporučeni izvori
- cppreference (C) — logical operators — detaljno objašnjenje logičkih operatora u C: cppreference — C logical operators
- cppreference (C) — arithmetic operators — aritmetički operatori i napomene o celobrojnom deljenju: cppreference — C arithmetic operators
- cppreference (C) — bitwise & other operators — bitovni operatori i ostali operatori: cppreference — C bitwise operators
- cppreference (C++) — operators — sveobuhvatna stranica o operatorima u C++ (uključuje informacije o overload-ovanju): cppreference — C++ operators
- cppreference (C++) — operator precedence — pravila prioriteta operatora (važno za čitljivost i izbegavanje grešaka): cppreference — operator precedence
- Integer promotions / implicit conversions (reference) — pravila promocija i konverzija koja uticu na izraze: cppreference — integer promotion (C) • cppreference — implicit conversions (C++)
- ISO/IEC 9899 (C standard) — zvanični standard za C (formalni, autoritativni izvor; obično plaćen): ISO/IEC 9899 (C standard)
- Kernighan & Ritchie — The C Programming Language (K&R) — klasik za brz i jasan pregled jezika: K&R — Wikipedia (info & editions)
|
Prethodno
|< Podaci u C jeziku |
Sledeće
Grananje u programu >| |