NCP=Napisati C program
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?
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
|
/ % Množenje,deljenje,ostatak s leva na desno
+ - Sabiranje,oduzimanje s leva na desno
<< >> Levi shift, desni shift s leva na desno
_________________________________________________________________________________________
< <= > >= 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
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.
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
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)) |
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)