Forum » Pomoč in nasveti » Vprašanje C++
Vprašanje C++
blaz87 ::
Pozdravljeni. Mam sledeči problem:
do
{
cout < < "Vnesi tip: s - server, o - sebni, p - renosni: ";
cin>>tip;
}while((tip!='s')&&(tip!='p')&&(tip!='o'));
Se pravi kadar je eden od teh 3 znakov me spusti dalje, drugače sem v zanki.
Zakaj mi stvar tak dela? Ko pa namesto && vstavim logični ali torej || mi pa ne gre.
Ali sem že malo pozabil, ali česa nevem, ali me pa kaj kompajler zajebava.
Lep pozdrav,
Blaž
do
{
cout < < "Vnesi tip: s - server, o - sebni, p - renosni: ";
cin>>tip;
}while((tip!='s')&&(tip!='p')&&(tip!='o'));
Se pravi kadar je eden od teh 3 znakov me spusti dalje, drugače sem v zanki.
Zakaj mi stvar tak dela? Ko pa namesto && vstavim logični ali torej || mi pa ne gre.
Ali sem že malo pozabil, ali česa nevem, ali me pa kaj kompajler zajebava.
Lep pozdrav,
Blaž
Mitch ::
Mislim, da je stvar v optimizaciji kompajlera. V več operatorskih izrazih namreč večina kompajlerjev optimizira stvar tako, da v and izrazih takoj prekine z ovrednotenjem ko naleti na logično 0 in pri or izrazih takrat, ko naleti na logično enico. Od samega kompajlerja pa je odvisno, ali je to optimizacijo moč izključiti oz. vključiti...
netanyahu ::
Nič ni od prevajalnika odvisno. V C-ju se logični operatorji vedno izvajajo kratkostično in vsi programi se zanašajo na to.
To.
Ali sem že malo pozabil, ali česa nevem, ali me pa kaj kompajler zajebava.
To.
krneki0001 ::
A nimaš ti povsod "AND" vmes, kar pomeni, da morajo biti izpolnjeni vsi pogoji? Moral bi se vprašati ali je en, drugi ali tretji, ne če so vsi naenkrat.
Genetic ::
Namesto
while((tip!='s')&&(tip!='p')&&(tip!='o'));
while((tip=='s')||(tip=='p')||(tip=='o'));
pa bi moralo delati
Saj ne, bluzim, nisem se se prav zbudil.
while((tip!='s')&&(tip!='p')&&(tip!='o'));
while((tip=='s')||(tip=='p')||(tip=='o'));
pa bi moralo delati
Saj ne, bluzim, nisem se se prav zbudil.
Zgodovina sprememb…
- spremenil: Genetic ()
mte ::
Fantje, tista koda je že pravilna. Problem je drugje, ampak Blaž ni povedal KAJ mu ne dela.
lp
lp
blaz87 ::
Se opravičujem.
Saj točno tak. Koda je pravilna, sem se dolgo igral da sem spravil to na to da dela. Samo mi ni logično zakaj mi z logičnimi in(&&) stvar dela.
Če bi pa po vsej logiki morali bit logični ali(||), kot je zgoraj že omenjal genetic, vendar mi takrat ne dela (kar koli vnesem se zanka vedno ponavlja).
Stvar mi dela dobro, ampak mi ne gre v glavo zakaj &&. Saj za njega velja da morajo biti izpolnjeni vsi pogoji, da me spusti dalje. Je pa ravno obratno. Torej stvar dela kot če bi bil logični ali.
Prosim samo za razlago ker ne morem tega razumet.
Hvala in Lep pozdrav.
Blaž
Saj točno tak. Koda je pravilna, sem se dolgo igral da sem spravil to na to da dela. Samo mi ni logično zakaj mi z logičnimi in(&&) stvar dela.
Če bi pa po vsej logiki morali bit logični ali(||), kot je zgoraj že omenjal genetic, vendar mi takrat ne dela (kar koli vnesem se zanka vedno ponavlja).
Stvar mi dela dobro, ampak mi ne gre v glavo zakaj &&. Saj za njega velja da morajo biti izpolnjeni vsi pogoji, da me spusti dalje. Je pa ravno obratno. Torej stvar dela kot če bi bil logični ali.
Prosim samo za razlago ker ne morem tega razumet.
Hvala in Lep pozdrav.
Blaž
mte ::
Aha, to je to, pogosto začetniško vprašanje.
Primer, ko pritisneš nekaj kar ni s, o, ali p:
prvi pogoj (tip!='s') je 1 (true), drugi pogoj je 1 in tretji pogoj tudi 1.
1 IN 1 IN 1 = 1, zato ponoviš vprašanje.
1 ALI 1 ALI 1 = 1, zato ponoviš vprašanje. Slučajno se ujema.
Če pa pritisneš recimo 's':
0 ALI 1 ALI 1 = 1. To pomeni da pritisneš 's' in se vprašanje ponovi. Kar pa ni pričakovano.
0 IN 1 IN 1 = 0, zato se vprašanje ne ponovi in koda gre naprej, kar je pravilen izid.
Skratka - če negiraš pogoje tipa (a==1)||(a==2)||(a==3), se zamenjajo oboji operatorji, torej (a!=1)&&(a!=2)&&(a!=3).
Primer, ko pritisneš nekaj kar ni s, o, ali p:
prvi pogoj (tip!='s') je 1 (true), drugi pogoj je 1 in tretji pogoj tudi 1.
1 IN 1 IN 1 = 1, zato ponoviš vprašanje.
1 ALI 1 ALI 1 = 1, zato ponoviš vprašanje. Slučajno se ujema.
Če pa pritisneš recimo 's':
0 ALI 1 ALI 1 = 1. To pomeni da pritisneš 's' in se vprašanje ponovi. Kar pa ni pričakovano.
0 IN 1 IN 1 = 0, zato se vprašanje ne ponovi in koda gre naprej, kar je pravilen izid.
Skratka - če negiraš pogoje tipa (a==1)||(a==2)||(a==3), se zamenjajo oboji operatorji, torej (a!=1)&&(a!=2)&&(a!=3).
Genetic ::
Z || operatorjem ti bo delalo, ce bos namesto
while((tip!='s')&&(tip!='p')&&(tip!='o'));
uporabil
while(!((tip=='s')||(tip=='p')||(tip=='o')));
!!(A&B&C) == A&B&C //dvojna negacija
!(!(A&B&C) == !(!A|!B|!C) , A == (tip!='s') => !A == tip=='s'
Ce vstavis crko x != 's','p','o', bos v obeh primerih moral preveriti vse tri pogoje,
ce pa vstavis eno od crk 's','p','o', pa bo tudi v obeh primerih preverjalo enako stevilo pogojev.
Pogoji, sestavljeni iz || se izvajajo, dokler prvi (od leve proti desni) ni true,
pogoji z && pa se izvajajo, dokler prvi ni false.
Tako da je boljse, ce uporabis varianto z &&, je bolj pregledno.
while((tip!='s')&&(tip!='p')&&(tip!='o'));
uporabil
while(!((tip=='s')||(tip=='p')||(tip=='o')));
!!(A&B&C) == A&B&C //dvojna negacija
!(!(A&B&C) == !(!A|!B|!C) , A == (tip!='s') => !A == tip=='s'
Ce vstavis crko x != 's','p','o', bos v obeh primerih moral preveriti vse tri pogoje,
ce pa vstavis eno od crk 's','p','o', pa bo tudi v obeh primerih preverjalo enako stevilo pogojev.
Pogoji, sestavljeni iz || se izvajajo, dokler prvi (od leve proti desni) ni true,
pogoji z && pa se izvajajo, dokler prvi ni false.
Tako da je boljse, ce uporabis varianto z &&, je bolj pregledno.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Python - pomoč (strani: 1 2 3 )Oddelek: Programiranje | 18133 (8881) | black ice |
» | [Java] While zankaOddelek: Programiranje | 2377 (1960) | kunigunda |
» | [C] bitni operator (strani: 1 2 3 )Oddelek: Programiranje | 5560 (4393) | Thomas |
» | Se bo Silicijeva dolina morala preimenovati?Oddelek: Novice / Procesorji | 3489 (3489) | frenk |
» | Kateri jezik je bolji?Oddelek: Programiranje | 2209 (1746) | Monster |