Miért nem működik a || (vagy) funkció while-ban? (C++)
tegyük fel van x=10 és y=15
csinálok egy while folyamatot amiben x és y értéke csökken(x--; y--).
Azt szeretném, hogyha x==5 vagy y==11 akkor álljon le a while folyamat.
Én így csináltam de nem jó ( elfut a program a codeblocks nem érzékel hibát de a kívánt funkcio nem működik):
while(x==5==false || y==11==false)
{
x--;
y--;
}
mi lehet a gond?
while(x==5==false || y==11==false)
Ez meg mi???
Ilyet nem csinálunk SOHA!
while(x==5 || y==11)
Soha ne írj így 3 tagú feltételt...
Ha meg tagadni kell, ott a ! jel!
Pl.:
while(x!=5 || y!=11)
Mert ő nem a megoldást írta, csak egy óriási hibára világított rá.
while (x > 5 || y > 11){
x--;
y--;
}
Na, még én is elrontottam...
while (x > 5 && y > 11){
x--;
y--;
}
De, tökéletesen működik, csak logikai hibás a kódod.
(Csak a formai hibára kérdeztél rá...)
Ugyanis a while addig megy, amíg igaz a feltétel.
Tehát pl:
x = 5, x = 12 -> 5 != 5 hamis, de 12 != 11 igaz -> hamis vagy igaz => igaz -> fut tovább
x = 6, y = 11 -> 6 != 5 igaz, de 11 != 11 hamis -> igaz vagy hami => igaz -> fut tovább
x = 8, y = 18 -> 5 != 8 igaz, 18 != 11 igaz -> igaz vagy igaz => igaz -> fut tovább
x = 5, y = 11 -> 5 != 5 hamis, 11 != 11 hamis -> hamis vagy hamis => hamis -> megáll
Gondold át, hogy mit is akarsz elérni.
(Végre egy jó példa, hogy miért is kell a programozáshoz matematika. Ez itt színtiszta logika.)
Hogy a "háromtagú" (nem igazán az) összehasonlítás miért nem működik (működik, csak nem úgy, ahogy elvárnád).
Az == operátor balról jobbra asszociatív, azaz az
a == b == c kifejezés zárójelezése a következő lesz: (a == b) == c. Azaz kiértékeli, hogy (a == b), és ennek a bool eredményét veti össze c-vel.
Azaz a te feltételed egyenként tökéletesen ellenőrzi, hogy x elérte már az ötöt, egyszerűbben így írhattad volna le: while(x != 5 || y != 11)
Az más kérdés, hogy ez nem azt ellenőrzi, amit te szeretnél. Itt, ha nem egyszerre érik el, akkor valamelyik jó lesz, tehát tovább fog futni. Próbáld ki mondjuk x = 10 és y = 16-al, le fog állni.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!