» »

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ž

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.


Ali sem že malo pozabil, ali česa nevem, ali me pa kaj kompajler zajebava.

To.

krneki0001 ::

Zakaj tega ne rešiš s preprostim IF stavkom ali pa mogoče CASE?

mte ::

In kaj ti (ne) dela?

Mitch ::

Zanka se mora vsaj enkrat izvest, da lahko ovrednotiš pogoj. Torej IF stavek odpade...

kiros ::

kaj če maš CAPS LOCK vključen :P
kiros

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.

Zgodovina sprememb…

  • spremenil: Genetic ()

mte ::

Fantje, tista koda je že pravilna. Problem je drugje, ampak Blaž ni povedal KAJ mu ne dela.
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ž

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).

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.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Python - pomoč (strani: 1 2 3 )

Oddelek: Programiranje
10317178 (7926) black ice
»

[Java] While zanka

Oddelek: Programiranje
262191 (1774) kunigunda
»

[C] bitni operator (strani: 1 2 3 )

Oddelek: Programiranje
1125239 (4072) Thomas
»

Se bo Silicijeva dolina morala preimenovati?

Oddelek: Novice / Procesorji
163386 (3386) frenk
»

Kateri jezik je bolji?

Oddelek: Programiranje
462115 (1652) Monster

Več podobnih tem