Onko mahdollista laittaa hyppykäskyä toiseen caseen esim.
switch(a) { case 1: // jotain toimintaa break; case 2: // tästä case ykköseen break; }
(Mod. Edit. Kooditagit.)
On kyllä, jos lisää erillisen nimiön:
case 1: eka: // jotain toimintaa break; case 2: goto eka; break;
Eikö olisi viksumpaa laittaa näin:
case 2: //tee jotain case 1: //tee jotain break;
Eli siis, kun case 2 suoritetaan, sen suoritus jatkuu myös case 1:lle, toisin sanoen breakkiin asti. Goto on niin ikiwanha juttu, että sitä kannattaa viimeiseen saakka välttää. Switchin rakenne kannattaa suunitella niin, ettei sen sisällä tarvitse hyppyyttää.
Ei vanha välttämättä aina ole huono :) Tämän sanon vain siksi, että goton sanominen "ikiwanhaksi" ei välttämättä tarkoita, ettäkö se olisi huono.
Eikös tuon goto-käskyn pitäisi olla paras tehojen kannalta? Senhän saa konekielellä yhteen käskyyn.
Tosin tässä tapauksessa luulen, että Laakkosen keino on parempi.
Kiitos vastauksista, tässä tapauksessa tuo goto toimii parhaiten :)
KoodiNoppa kirjoitti:
Senhän saa konekielellä yhteen käskyyn.
Olettaen että se todella kääntyisi aina vaan yhdeksi konekielikäskyksi, niin voin vaan kuvitella minkälaisia muistivuotoja yms. se aiheuttaisi.
Grez kirjoitti:
Olettaen että se todella kääntyisi aina vaan yhdeksi konekielikäskyksi, niin voin vaan kuvitella minkälaisia muistivuotoja yms. se aiheuttaisi.
Sehän juuri nimenomaan kääntyy yhdeksi käskyksi, mutta sitäpä ei voikaan käyttää esimerkiksi funktioiden välillä tai muuten niin, että se jotain rikkoisi. Tietenkin esimerkiksi malloc
illa varatun muistin vapauttaminen on käyttäjän vastuulla ihan goto
sta riippumatta. C++ on tietenkin mutkikaampi laitos, mutta näin C:ssä.
C++:ssa goto
generoi tarpeelliset destruktorikutsut ennen sitä konekielistä hyppykäskyä. C:ssä goto
vastaa lähtökohtaisesti konekielistä hyppykäskyä. Kummassakaan tapauksessa ei aiheudu vuotoja, joita koodissa ei voisi olla jo muutenkin esimerkiksi if
:fien, return
:ien tai exceptionien takia.
Metabolix kirjoitti:
Sehän juuri nimenomaan kääntyy yhdeksi käskyksi, mutta sitäpä ei voikaan käyttää esimerkiksi funktioiden välillä tai muuten niin, että se jotain rikkoisi.
Kyllä sillä voi kuitenkin hypätä muuttujien näkyvyysalueen ulkopuolelle tai niiden sisäpuolelle. Tietenkin jos se tila kaikille muuttujille varataan joka tapauksessa funktion alussa ja vapautetaan lopussa, niin sittenhän tuosta ei ole ongelmaa. En nyt ihan tarkkaan tiedä miten kääntäjät yleensä homman hoitaa, mutta kuten sanoin, voin kuvitella muistivuodot jos tuollaisista ei huolehdita goton yhteydessä.
Olen kuullut goton käytöstä sellaista että jos osaa tehdä asian ilman gotoa niin sitten gotoa voi hyvin käyttääkkin...
Aika typerältähän toi kuullostaa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.