Logički izrazi u C++
Ono što smo naučili do sada, nam u procesu programiranja ne
omogućuje puno. Naime sad smo u stanju pisati programe koji se izvršavaju
uvijek na isti način, tj. u programu nema nekog odlučivanja. Upravo te odluke i
neki drugi mehanizmi su ono što programiranje, tj. programe koji tako nastaju ,
čini korisnim. Npr. kada se trebate prijaviti na operativni sistem(OS) pod
nekim korisničkim imenom, OS provjerava da
li ste unijeli za to korisničko ime ispravnu lozinku, i tek
nakon ispravne lozinke vam dozvoljava da radite sa računarem. Dakle OS mora
donijeti neku odluku. Većina odluka, grananja i petlji u svakom programskom
jeziku je kontrolisana logičkim izrazima.
To
su
izrazi
za koje se može uvijek utvrditi da li su tačni ili netačni.
U matematici smo ovo zvali iskaz ili sud. Vjerovatno najjedenostavniji logički
izrazi su oni koji upoređuju neke veličine sa nekim od operatora za
upoređivanje. Ti operatori su nam poznati iz matematike(matematičke relacije)...
Relacijski operator |
Matematički simbol |
Ime
operatora |
Primjer |
Vrijednost |
> |
> |
biti veći |
7>5 |
tačno |
< |
< |
biti manji |
4<3 |
netačno |
>= |
≥ |
biti veći ili jednak |
5>=5 |
tačno |
<= |
≤ |
biti manji ili jednak |
3<=2 |
netačno |
== |
= |
biti jednak |
2=4 |
netačno |
!= |
≠ |
biti različit |
3!=5 |
tačno |
Važno: Operatori koji se
sastoje od dva simbola, nemaju između njih blanko znak!
Dakle, ovaj koncept tačnog(eng. true) i netačnog(eng.
false) je na ovakvim primjerima dosta lako razumjeti. Logički izrazi mogu biti i
dosta složeniji, a osnovni način kako pravimo složene logičke izraze,jeste
udruživanjem jednostavnih izraza(kao što su oni gore) putem binarnih logičkih
operatora i i ili.Postoji
i unarni logički operator ne koji djeluje na
jedan iskaz, za razliku od prva dva koji udružuju dva iskaza(otuda se prva dva
zovu binarni). Dakle sad nam se učenje matematike itekako isplati, jer je ovo
sve viđeno! Ipak za one koji sve ovo vide prvi put, ili barem tako tvrde,
daćemo tabele sa pravilima koja vrijede za ova tri logička operatora.
Napomena:tačno ili istinito(T) je ovdje
označeno sa 1, a netačno ili neistinito sa 0. Na to se treba priviknuti jer i
C++ tako predstavlja logičke vrijednosti true i false.
Logički operator |
Mat. simbol |
Operator |
Operacija |
|
bos |
eng |
|||
&& |
^ |
I |
AND |
konjukcija |
II |
v |
ILI |
OR |
disjunkcija |
! |
┐ |
NE |
NOT |
negacija |
p |
q |
p&&q |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
p |
q |
pIIq |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
p |
p! |
0 |
1 |
1 |
0 |
Prilikom određivanja istinitosti nekog složenog iskaza,
vodimo računa da je redosljed izvršavanja logičkih operacija:negacija,
konjunkcija i disjunkcija. Jedino što može promijeniti ovaj redosljed su stare dobre zagrade!
Odredi
istinitost navedenih logičkih izraza:
izraz |
vrijednost |
objašnjenje |
!( true || false ) |
0 |
!( true ) → !true → false! |
!( 1 || 1 && 0 ) |
0 |
!( 1 || 0 ) → !( 1) → 0 |
!( ( 1 || 0 ) && 0 ) |
1 |
!( ( 1 ) && 0 ) → !( 1 && 0 ) → !( 0 ) → !0 → 1 |
Sad
kad znamo sve o logičkim izrazima, idemo naučiti kako neku izjavu unutar programa
izvršiti samo pod određenim uslovom. Za to nam služi kontrolna struktura if, koja u C++ izgleda ovako:
if (x>100)
cout<<"broj je veci od 100";
x++;
Izjava koja štampa rečenicu će se izvršiti samo ako je
logički izraz unutar zagrade tačan. Dakle ako x ima vrijednost 5,rečenica se
neće štampati, dok za vrijednost 101 hoće.
Ono što je važno zapamtiti jeste da if izjava kontroliše
izvršavanje samo prve izjave koja se nalazi neposredno iza nje. To može biti
nekad problem, jer postoje situacije gdje želimo da if izjava kontroliše dvije,
tri ili više izjava. U tom slučaju sve izjave koje želimo da budu pod kontrolom
if izjave treba staviti u vitičaste zagrade. Na taj način tvorimo nešto što se
naziva blok izjava.
if (x >100 && x%2==0){
cout<<"broj je veci od 100 i paran\n";
x=x/2;
} cout<<x;
Ovdje if izjava kontroliše dvije izjave koje se nalaze u
vitičastoj zagradi. Ako x ima vrijednost 43, na ekranu će biti štampano 43. Ako
je x postavljeno na 101 na ekranu će biti štampano 101, dok će za vrijednost
102 štampati:
broj je veći od 100 i paran
51.
Važno:Vrlo
često se dešava da neiskusni programeri umjesto operatora == zabunom koriste
operator = unutar if izjave, kao npr.
if(x=10)
cout<<"x je 10";
Već je napomenuto kako C++ true predstavlja sa 1 a false sa 0. U stvari C++ će bilo koju vrijednost različitu
od 0 pretvoriti u true, dok 0 pretvara u false.
Mi znamo da izjava x = 10 pored toga što x dodjeljuje vrijednost 10, isto tako
i vraća vrijednost. To je najočitije u izjavi y=x=5,
koja obe varijable postavlja na 5. Vrijednost koju naša izjava vraća je 10, pa
C++ to pretvara u true, što znači da će se rečenica x je 10 uvijek štampati,
bez obzira kolika je vrijednost x bila prije if izjave.
Važno: Ne stavljajte iza if izjave tačku
zarez. Ako ovo uradite onda se dešava potpuno neželjen efekat.Naime kako
kompajler zna da iza if izjave ne ide tačkazarez,
on misli da taj tačka zarez u stvari pripada izjavi koja se
izvršava u if dijelu. Kako između if izjave i tog tačka zareza nema ništa,
kompajler u if dijelu izvršava praznu izjavu tj. ne čini ništa! To je
ilustrirano u donjem primjeru.
if (x==5); cout<<”broj je 5”; |
kompajler
vidi kao |
if (x==5); cout<<”broj je 5”;Gornji dio koda će uvijek štampati broj je 5 jer izjava cout<<”broj je 5”; uopšte nije dio if izjave!!! |
Kada
C++ vrši procjenu da li je neka složeni logički izraz tačan ili netačan, on to
radi dosta efikasno.Tako npr. ako je logički izraz koji procjenjuje disjunkcija
dva jednostavnija izraza, a prvi izraz koji ulazi u disjunkciju je tačan, onda
drugi izraz koji ulazi u disjunkciju neće biti ni provjeravan. Zašto bi ga i provjeravao
kad će disjunkcija bez obzira na vrijednost drugog iskaza ionako biti tačna?
Ipak tvorci
drugih programskih jezika nisu vodili računima o ovakvim sitnim detaljima, detaljima koji C++ čine jako efikasnim programskim jezikom.
1.
Da li će sljedeći kod proizvesti dijeljenje
j=-1;
if ((j>0)&&(1/(j+1)>10))
cout<<i<<endl;
2.
Da li je sljedeći logički
!( ( false || 100 ) && !0 )