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 < 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 | -> | , |
Sledeće
Grananje u programu >| |