while ja break

koodinpätkän rakenne on seuraavanlainen:

while(..) {

while(..) {
if(..) {
}
if(..) {
}
}
while(..) {
...
}

}

Millä konstilla saisin tuolla if:ssä olevan ehdon perusteella lopetettua uloimman whilen suorituksen?
11703
Äänestä

Muut lukivat myös

Vastaukset 11

Vanhimmat

tästä apua?

continue;

Äänestä
  • Eikös continue; jatka suoritusta, sen sijaan end; tai break; pysäyttäää, tämä siis muissa kielissä

    Äänestä

  • 122 kirjoitti:

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

    Äänestä

  • 122 kirjoitti:

    Eikös continue; jatka suoritusta, sen sijaan end; tai break; pysäyttäää, tämä siis muissa kielissä

    http://www.cppreference.com/keywords/continue.html

    mielestäni se kyllä ainakin tuossa tapauksessa mennee puis tuosta loopista?

    miten vaan..

    Äänestä

  • tswigh_ kirjoitti:

    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;
    }

    Äänestä

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

Äänestä
  • 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.

    Äänestä

  • aloittaja. kirjoitti:

    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.

    Äänestä

  • *BSD kirjoitti:

    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.

    Äänestä

  • The Real J. kirjoitti:

    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.

    Äänestä

  • n0b kirjoitti:

    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.

    Äänestä

Kommentoi aloitusta


npos kirjoitti:

koodinpätkän rakenne on seuraavanlainen:

while(..) {

while(..) {
if(..) {
}
if(..) {
}
}
while(..) {
...
}

}

Millä konstilla saisin tuolla if:ssä olevan ehdon perusteella lopetettua uloimman whilen suorituksen?

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu