OPERATORI U JEZIKU C++
U programskom jeziku C++, operatori su osnovni alati za manipulaciju podacima, omogućavajući izvođenje različitih matematičkih, logičkih i bitovnih operacija. Operator predstavlja simbol koji označava radnju nad jednim ili više operanada, pri čemu rezultat može biti promena vrednosti, poređenje ili logička procena.Operatori se klasifikuju prema broju operanada na:
- Unarne operatore – deluju na jedan operand (npr. ++, --).
- Binarne operatore – primenjuju se na dva operanda (npr. +, -, *).
- Ternarne operatore – koriste tri operanda, kao što je uslovni operator (? :).
- Aritmetički operatori poput +, - i * koriste se za osnovne matematičke operacije.
- Relacijski operatori (==, !=, >, <) omogućavaju poređenje vrednosti.
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
Primer operatora:int a = 10, b = 20;
int result = (a < b) ? a : b; // ternarni operator vraća 10 jer je a manje od b
Aritmetički operatori
Koriste se za izraze sa osnovnim računskim operacijama. U tabeli ispod je dat pregled aritmetičkih operatora| 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
intmain()() {
std::cout<<"Unesite vrednosti za R1 i R2: ";
std::cin>>R1>>R2; // Korisnik unosi R1 i R2
Re = R1*R2/ (R1+R2); // Dobijeno rešenje zadate jednačine
std::cout<<"Rešenje: "<<Re<<std::endl;
}
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
Rešenje:Od podataka nam treba vreme u sekundama (Vr), a na izlazu za ispis minuti (mm) i sekunde (ss)intmain()() {
std::cout<<"Unesite vreme u sekundama: ";
std::cin>>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; // ss=132%60=12
std::cout<<"Vreme: "<<mm<<" : "<<ss<<std::endl;
}
Kada se kao operandi u jednoj aritmetičkoj operaciji koriste zajedno ceo broj i realan broj, rezultat je realan broj. Ceo broj se implicitno konvertuje u realan broj pre samog izračunavanja. U tabeli koja sledi su prikazani tipovi podataka koji se vraćaju iz aritmetičkih operacija, na osnovu tipova operanada. Potrebne konverzije se vrše pre nego što se obavi operacija.
| 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 "++","--"
Postoje i dva operatora koji omogućavaju skraćeno izračunavanje. To su operator ++(inkrement) koji operand povećava za 1 i operator – (dekrement) koji operand smanjuje za 1. Oba operatora mogu da se pojave ispred operanda (prefiks) i iza operanda (postfiks). Kod verzije prefiks, ++op/--op se prvo operand povećava za 1, pa se taj rezultat koristi dalje u izrazima. Kod verzije postfix se prvo operand primeni u izrazu (stara vrednost), a tek posle se ta vrednost promeni.
Relacioni i uslovni operatori
Relacioni operator poredi dve vrednosti i određuje vrednost između njih. Na primer, != vraća tačno ako dva operanda nisu jednaka. U tabeli koja sledi su dati relacioni 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
intmain()() {
std::cout<<"Unesite vrednost za a: ";
std::cin>>a;
std::cout<<"Unesite vrednost za b: ";
std::cin>>b;
if (a>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 operatori se koriste za logičke operacije između booleanskih vrednosti (true i false). Najčešće se koriste u uslovima za kombinovanje više logičkih izraza. Primeri logičkih operatora su:- && - 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 x = true;
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=4,b=7, c=11- a>b
- ! a > b && !(b<c)
- a !=0 || !(a>(b>c))
Rešenje:
Vrednosti logičkih izraza u C++ jeziku su takođe tipa bool. Logički izraz ima vrednost true ako je uslov ispunjen (istinit), odnosno false ako uslov nije ispunjen (neistinit). Ovo se razlikuje od C jezika, gde su logičke vrednosti predstavljene celim brojevima (1 za istinito i 0 za neistinit). Ako definišemo tri cela broja sa vrednostima 4, 7, i 11, vrednosti logičkih izraza biće sledeće:
1. Izraz a > b
Daje vrednost false jer 4 nije veće od 7.
a > b
4 > 7
false
2. Izraz !(a > b && !(b < c))
Ima vrednost true. Kada zamenimo vrednosti za a, b i c, dobijamo:
!(4 > 7 && !(7 < 11))
= !((false) && !(true))
= !((false) && false)
= !(false)
= true
Prvo se obrađuju operatori > i <, jer imaju viši prioritet od logičkih operatora. Dakle, 4 > 7 je false, a 7 < 11 je true. Zatim, operator &&& kombinuje te vrednosti: false && true daje false. Na kraju, negacija ! pretvara false u true.
3. Izraz a != 0 || !(a > (b > c))
Daje vrednost true. Kada zamenimo vrednosti za a, b i c, dobijamo:
4 != 0 || !(4 > (7 > 11))
= true || !(4 > false)
= true || !(4 > 1)
= true || !(true)
= true || false
= true
Objašnjenje:
4 != 0je true, jer je4različito od0.- Izraz
(7 > 11)je false, jer7nije veće od11. - Zatim,
4 > falsetretirafalsekao0, pa je rezultat4 > 0, što daje true. - Na kraju, negacija
!dajefalse, ali operator||kombinuje sa prvim delom (true || false), što rezultira true.
Zaključak:
Redosled izvršavanja operatora u C++ jeziku sledi prioritete, gde se operatori poređenja (>, <, !=) izvršavaju pre logičkih operatora kao što su &&& i ||. Kao i u matematici, zagrade se koriste za jasno određivanje redosleda izvršavanja.
usingnamespacestd;
intmain(){
boole, f, g;
a = 4;// Dodeljivanje vrednosti promenljivoj a
b = 7;// Dodeljivanje vrednosti promenljivoj b
c = 11;// Dodeljivanje vrednosti promenljivoj c
// Izračunavanje logičkih izraza
e = a > b;// e je true ako je a veće od b, inače false
f = !(a > b && !(b < c));// Kombinacija AND i NOT operatora
g = a != 0 || !(a > (b > c));// Kombinacija OR i NOT operatora
// Ispisivanje vrednosti izraza
cout<<"e="<<e<<endl;
cout<<"f="<<f<<endl;
cout<<"g="<<g<<endl;
}
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.
#include<stdio.h>
#include<stdbool.h>
intmain(){
inta = 10;
intb = 20;
intc = 15;
// Prvo koristimo relacione operatore da dobijemo booleanske vrednosti
booluslov1 = (a < b);// true jer je 10 manje od 20
booluslov2 = (c == 15);// true jer je c jednako 15
// Zatim koristimo logičke operatore da kombinujemo rezultate
boolkonacanRezultat = uslov1 && uslov2;// true jer su oba uslova tačna
printf("Konacan rezultat: %d\n", konacanRezultat);
return0;
}
U ovom C programu koristimo tip bool iz zaglavlja <stdbool.h>, koje je uvedeno u C99 standardu. Pre ovog standarda, C je koristio celobrojne vrednosti za booleanske izraze (0 za false i nenulu za true). U C99, bool omogućava korišćenje vrednosti true i false, što čini kod čitljivijim i semantički jasnijim.
Program prvo definiše tri celobrojne promenljive (a, b, c) i koristi relacione operatore za kreiranje booleanskih vrednosti (uslov1 i uslov2). Zatim, koristi logički operator && da kombinuje ove uslove u konačan rezultat (konacanRezultat), koji se ispisuje na ekranu.
Bez #include <stdbool.h>, tip bool ne bi bio prepoznat, a kod bi izazvao grešku prilikom kompilacije.
Operatori po bitovima
Operatori po bitovima omogućavaju izvođenje operacija na nivou bitova unutar celobrojnih podataka. Postoje dve grupe operatora 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
Npr. za podatke tipa int koji imaju po 16 bitova memorije:- 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
Osnovni operator dodele je operator =, kojim se jedna vrednost dodeljuje drugoj. U C, C++ postoje i operatori dodele kojim se odjednom izvršava više operacija. Pretpostavimo da želite da saberete vrednost promenljive sa nekim brojem i da rezultat dodelite istoj promenlivoj. Napisali biste: i = i + 2; Skraćeno se ovo može napisati pomoću operatora += na sledeći način: i += 2; Prethodna dva izraza su ekvivalentna. U tabeli koja sledi su dati neki od operatora ovog tipa:| 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++
Uslovni izraz: ? :
Posmatrajmo sledeći problem:
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:
cin>>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:
cout<<"Veći broj je "<<maxAB<<endl;
SIZEOF operator
Pomoću ovog operatora se može odrediti veličina podatka u bajtovima. Sledeći primer to demonstrira:#include <iomanip>
using namespace std;
int main() {
int a;
char b;
short c;
long d;
long long e;
unsigned long int f;
cout << "\nUnesi ceo broj a: ";
cin >> a;
cout << "\nUnesi ceo broj b: ";
cin >> b;
cout << "\nUnesi ceo broj c: ";
cin >> c;
cout << "\nUnesi ceo broj d: ";
cin >> d;
cout << "\nUnesi ceo broj e: ";
cin >> e;
cout << "\nUnesi ceo broj f: ";
cin >> f;
cout << "\nVelicina podatka int je " << sizeof(int) << " bajta i to je jednako velicini a=" << sizeof(a) << " bajta";
cout << "\nVelicina podatka char je " << sizeof(char) << " bajta i to je jednako velicini b=" << sizeof(b) << " bajta";
cout << "\nVelicina podatka short je " << sizeof(short) << " bajta i to je jednako velicini c=" << sizeof(c) << " bajta";
cout << "\nVelicina podatka long je " << sizeof(long) << " bajta i to je jednako velicini d=" << sizeof(d) << " bajta";
cout << "\nVelicina podatka long long je " << sizeof(long long) << " bajta i to je jednako velicini e=" << sizeof(e) << " bajta";
cout << "\nVelicina podatka unsigned long int je " << sizeof(unsigned long int) << " bajta i to je jednako velicini f=" << sizeof(f) << " bajta";
return 0;
}
Operator zareza ","
je binarni operator koji procenjuje svoj prvi operand i odbacuje rezultat, zatim procenjuje drugi operand i vraća ovu vrednost (i tip). Operator zareza ima najniži prioritet bilo kog C operatora. Comma deluje kao operator i separatorJoš po neki operator
Ostali operatori u jeziku C/C++ dati su u sledećoj tabeli:| Operator | Opis operatora |
|---|---|
| [] | Indeksiranje |
| () | Poziv funkcije |
| & | Adresa promenljive |
| . | Pristup članu klase ili strukture |
| -> | Pristup članu klase ili strukture preko pokazivača |
| :: | Rezolucija opsega (koristi se za pristup statičkim članovima klase ili za razrešavanje imena u okviru prostora imena) |
| * | Dereferenciranje pokazivača |
| .* | Pristup članu klase ili strukture kroz pokazivač na član |
| ->* | Pristup članu klase ili strukture kroz pokazivač na član koristeći pokazivač na objekat |
| sizeof | Vraća veličinu objekta ili tipa u bajtovima |
| typeid | Vraća tip objekta u runtime-u |
| dynamic_cast | Dinamičko kastovanje između klasa koje su deo iste hijerarhije |
| static_cast | Kompajlaciono kastovanje bez runtime provere |
| const_cast | Uklanja ili dodaje `const` kvalifikator tipu |
| reinterpret_cast | Reinterpretacija bita objekta za kastovanje između nepovezanih tipova |
Tabela prioriteta operatora
Kada u izrazu ima više operatora onda se prvo izvršavaju operacije većeg prioriteta. Ako su operatori istog prioriteta, tada će izvršavanje biti sa leva na desno u većini slučajeva(Pogledati kolonu Smer grupisanja u tabeli ispod).Donja tabela opisuje redosled prioriteta i asocijativnost operatora u C . Prednost operatera se smanjuje od vrha do dna.
| Prioritet | Broj operanada | Smer grupisanja: | Operatori: |
|---|---|---|---|
| 15 | 1 ili 2 | levo | [] () . -> |
| 14 | 1 | desno | ++ -- ~ ! + - * & sizeof typeid new delete |
| 13 | 2 | levo | * / % |
| 12 | 2 | levo | + - |
| 11 | 2 | levo | << >> |
| 10 | 2 | levo | < <= > >= |
| 9 | 2 | levo | == != |
| 8 | 2 | levo | & |
| 7 | 2 | levo | ^ |
| 6 | 2 | levo | | |
| 5 | 2 | levo | && |
| 4 | 2 | levo | || |
| 3 | 2 | desno | ?: |
| 2 | 2 | desno | = += -= *= /= %= &= ^= |= <<= >>= |
| 1 | 2 | levo | , |
Testiraj svoj kod ovde!
| Prethodno |<Podaci u C/C++ jeziku |
Sledeće Grananje u programu>| |
Srodni članci
Podaci-primeriJava predavanja
Matematički algoritmi
Priprema za kontrolni
Matrice
