TEORETSKI DEO-NASTAVAK



NCP=Napisati C program


Operatori dodele

Primer 1: dodela tipa promenljiva =izraz;

Na primer: x=x+2;

x=x%8-2;

Sa leve strane operatora dodele = mora stajati tzv. Lvalue tj. leva vrednost. Leva vrednost je objekat koji ima svoj prostor u memoriji i čiji sadržaj se može menjati.



Primer 2: dodela tipa promenljiva znak =izraz;

Na primer: x+=2;

x-=2;

x%=5;

x*=y+1;

Gore navedeni izrazi mogli su se pisati i kao:

x=x+2;

x=x-2;

x=x%5;

x=x*(y+1);



Primer 3: višestruka dodela

Na primer: x=y=z=1;

Tj, mogli smo pisati: x=y=(z=1);

ili: z=1; y=z; x=y;

Izraz z=1 ima vrednost destne strane operatora dodele, tj. vrednost 1.



Primer 4: implicitna konverzija šireg tipa u uži

int i;

i=1.8; /* i=1 */ implicitna konverzija float -> int

i=-2.8; /* i=-2 */ implicitna konverzija float -> int



Na osnovu gornjih primera protumačiti izraze:

int a=2,b=3;

int x,y,z;

x=z=y=a+b; Koje vrednosti imaju promenljive a,b,x,y,z nakon ove naredbe?

x=2*(z=3)+4*(y=5); Koje vrednosti imaju promenljive x,y,z nakon ove naredbe?



  1. Koje vrednosti imaju promenljive a,b,c,d,e,f nakon navedenog fragmenta programa?

    int a=5,b=4,c=2,d=1,e=-1,f=-2;

    a=(b=c/(d*e))+f;

    ODGOVOR: b=2/(1*-1)=2/-1=-2;

    a=b+f=-2-2=-4;

    Promenljive c,d,e,f nisu menjale vrednosti;



O P E R A T O R I – prioriteti i asocijativnost

Operatori najvišeg prioritea su na vrhu.

Simbol Opis rada ili naziv Asocijativnost

() poziv funkcije s leva na desno

[ ] indeksiranje s leva na desno

- > indirektni izbor stavke s leva na desno

. direktni izbor stavke s leva na desno


++ -- Increment/ decrement postfiksni

(type) Type cast [npr. (float) i] s desna na levo

++ -- Increment/ decrement prefiksni

sizeof Size in bytes s desna na levo


! Logical NOT s desna na levo

~ Bitwise NOT s desna na levo

- Aritmetička negacija s desna na levo

+ Unarni plus-nema efekta s desna na levo

& Address s desna na levo

* Na adresi, indirektan pristup s desna na levo


_________________________________________________________________________________________

< <= > >= Poredjenje s leva na desno

________________________________________________________________________________________

== != jednakost, nejednakost s leva na desno

________________________________________________________________________________________

& Bitwise AND s leva na desno

________________________________________________________________________________________

^ Bitwise exclusive OR s leva na desno

________________________________________________________________________________________

| Bitwise OR s leva na desno

________________________________________________________________________________________

&& Logical AND s leva na desno

________________________________________________________________________________________

|| Logical OR s leva na desno

________________________________________________________________________________________

? : Conditional s desna na levo

________________________________________________________________________________________

= Dodeljivanje s desna na levo

*=, /=, Dodeljivanje sa

%=, +=, računanjem

-=, <<=,

>>=, sa bit po bit

&=, ^=, operacijama

|=

________________________________________________________________________________________


, izračunavanje u sekvenci s leva na desno







Operatori inkrementacije i dekrementacije (uvećanja i umanjivanja)

Prefiksni ++ -- imaju visi prioritet od operatora * / %

Prefiksni ++ ima visi prioritet od sufiksnog ++



Prefiksni ++

int a;

a++;

isto kao a=a+1; ili kao a+=1; Zasto bi onda koristili a++? Ipak ima razlike.

Sufiksni ++

int a;

++a; isto kao a=a+1; ili kao a+=1;



OPREZ

int a=5;

b=a++;

int a=5;

b=++a;

EFEKAT: b=a; a=a+1;

tj. b=5; a=6;

EFEKAT: a=a+1; b=a;

tj. a=6; b=6;





Moze se pisati a++ ili ++b, ali ne moze (a*b)++, jer a*b nije leva vrednost.



  1. Odrediti vrednost promenljivih a,b,c nakon navedenih naredbi:

    a=b=1;

    c=(a+(++b))*3;

ODGOVOR: a=1; b=1; zbog ++b sledi b=2;

c=(a+b)*3=(1+2)*3=9

  1. Da li si izrazi sa leve strane ekvivalentni izrazima sa desne strane?

x+=y-=m

x=x+y-m

n%=y+m

n=n%y+m

z=m++---j

z=m-j

x=j*j++

x=j*(j+1)

z=++j==m!=y*2

z=(j==(m!=y*2))



    Konverzije tipova podataka

Automatska konverzija

int a=180;

float b=18.88;

int c=a+b;

Šta mislite koji je rezultat naredbe printf(“%d”, c);

Pri računanju a+b najpre se a konveruje u float, te vrednost izraza a+b je 198.879999 .

Potom se vrši konverzija int c= 198.879999 , a odatle c=198

Prijavljuje se upozorenje kompajlera da je možda došlo gubitka informacija, jer se širi rezultat smešta u užu promenljivu.

char < int < long < float <double



Eksplicitna konverzija

(tip) (izraz), kao na primer (int) (2.8*2) //vrednost izraza je 5

(tip) izraz, kao na primer (int)2.8 * 2 //vrednost izraza je 4, tj. 2*2 zbog veceg prioriteta cast operatora (int)



    Operator sizeof