koodinpätkän rakenne on seuraavanlainen:
while(..) {
while(..) {
if(..) {
}
if(..) {
}
}
while(..) {
...
}
}
Millä konstilla saisin tuolla if:ssä olevan ehdon perusteella lopetettua uloimman whilen suorituksen?
while(..) {
while(..) {
if(..) {
}
if(..) {
}
}
while(..) {
...
}
}
Millä konstilla saisin tuolla if:ssä olevan ehdon perusteella lopetettua uloimman whilen suorituksen?
Vastaukset 11
Vanhimmat
tästä apua?
continue;
Eikös continue; jatka suoritusta, sen sijaan end; tai break; pysäyttäää, tämä siis muissa kielissä
Jos laitan sinne iffiin tuon breakin, niin sehän pysäyttää sen sisemmän whilen suorituksen? Miten voin pysäyttää sen ulomman whilen, sen iffin perusteella? Tai sitten käsitin jotain väärin...
http://www.cppreference.com/keywords/continue.html
mielestäni se kyllä ainakin tuossa tapauksessa mennee puis tuosta loopista?
miten vaan..
jos katsot tuon esimerkkin komenttia.
continue tarkoitaa että lopeta looppin sisällä olevan lohkon suoritus ja palaa takaisiin looppiin.
1 2 3 4 5 6 7 8 9 11 12....20
eli jos ehto on 10 skippaa loopin loppu (tulostus) ja jatka looppin suoritusta.
if( i == 10 ) {
continue;
}
vaikka tod.näk kaikki hyökäävät kimppuun.
goto lause on helpoin ja selkein tapa poistua sisäkäisistä luupeista tuossa break; pysäyttäisi vain sisimmän luupin, joten siksi tarvitsemme muuttujan ja muutaman ehdon.
int done = FALSE
while( ..)
{
while(..)
{
if( ..)
{
done = TRUE;
break;
}
if(..)
{
done = TRUE;
break;
}
}
if (done == TRUE)
{
break; // poistutaan
}
while(..)
{
...
}
}
riippuen ratkaisusta tuon luupin voisi toteutaa funktion sisään ja poistua return lauseella (tosin taiteen sääntöjen mukaan funktiossa pitäisi olla vain yksi return...)
Kiitos ideasta! En voi käyttää goto:a ohjelmassani, mutta keksin ylimääräistä muuttujaa käyttävän vähän idioottimaisen patenttiratkaisun, jolla ongelma ainakin näyttää ratkenneen.
Aika outoa, että nykyään goto:n käyttöä pidetään salatieteenä, eikä siitä uskalleta edes keskustella.
On olemassa tilanteita, joissa ainoa järkevä ratkaisu on _oikeasti_ goto. Katsokaapa vaikka huvikseen jonkun käyttöjärjestelmän lähdekoodia. Goto on siisti tapa tehdä tietyt asiat.
Eli tommoset turhat muuttujat pois ja goto käyttöön. Kun vertaat ratkaisuja niin goto-versio on huomattavasti siistimpi.
Esimerkiksi jossain funktiossa voidaan käyttää ehdollista lausetta
if (jokin virhetilanne)
goto Error;
jolloin voidaan kätevästi virhetilanteessa hypätä funktion lopussa olevaan virheenkäsittelyyn. Monimutkaisessa funktiossa tuollaisen toteuttaminen muilla keinoilla olisi turhan kimuranttia.
En nyt sanoisi, että moisessa tilanteessa välttämättä on kovin hyödyllinen. Sekavoittaa koodia, varsinkin jos Error-lohko on jossain täysin avoimena kuten tuossa mahdollisesti. Sen sijaan poikkeukset tai yksinkertaisemmissa tilanteissa erityinen virheidenkäsittelyfunktio voisi olla sopiva.
Ei muuten sekoita, jos siis puhutaan yhdestä tuollaisesta virhe-blokista funktion lopusta.
Tuo on itseasiassa *siisti* ratkaisu, verrattuna siihen, että jokaisen funktion paluuarvon tarkistuksen jälkeen tehtäisiin samat vapautukset ja palattaisiin funktiosta (ja kutsuttavien funktioiden paluuarvot on luonnollisesti tarkistettava).
Edellä on siis kyseessä C, jota käytetään vieläkin esim. systeemi-ohjelmointiin. Nuo goto-asiat on siellä viimeseen asti hiottuja.
C ei taas gotoa tarvitse kun siellä funktiosta voi heittää poikkeuksen. Tosin hommalta putoaa sielläkin pohja kun tehdään esim. systeemikutsuja.