Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: switch case

Sivun loppuun

sypress [13.09.2007 13:51:17]

#

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

Antti Laaksonen [13.09.2007 14:13:14]

#

On kyllä, jos lisää erillisen nimiön:

case 1:
eka:
// jotain toimintaa
break;
case 2:
goto eka;
break;

kayttaja-4976 [13.09.2007 15:07:18]

#

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

squid [13.09.2007 20:09:47]

#

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.

KoodiNoppa [13.09.2007 21:57:43]

#

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.

tgunner [13.09.2007 22:02:15]

#

http://www.sdl.hitachi.co.jp/english/summary/2005/510063/img/fig_a_w/510063_A.gif

sypress [17.09.2007 11:04:02]

#

Kiitos vastauksista, tässä tapauksessa tuo goto toimii parhaiten :)

Grez [17.09.2007 11:16:48]

#

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.

Metabolix [17.09.2007 20:01:44]

#

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 mallocilla varatun muistin vapauttaminen on käyttäjän vastuulla ihan gotosta riippumatta. C++ on tietenkin mutkikaampi laitos, mutta näin C:ssä.

koo [17.09.2007 22:20:04]

#

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.

Grez [18.09.2007 00:17:55]

#

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

DumTom [30.09.2007 06:47:42]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta