[elektro] C kérdés
Papp Zoltán
zombi at c2.hu
Tue May 13 09:45:35 CEST 2008
2008.05.13. 09:22:01 dátumon hg12345 <hg12345 at freemail.hu> írta:
> Adott a
>
> switch (v)
> {
> case 1:
> if (feltétel)
> {
> case 2:
>
> };
> break;
>
> case 3:
> for(i=0;i<100;i++)
> {
> case 4:
> };
> break;
>
> }
>
> A fenti példa lefordul a GNU 4.02 (4.03) alatt és nem jelez hibát.
> A Kernighan könyv erről nem ír egy szót se.
> Ha nem tiltott, akkor szabad a switch tartományán belül akárhová
> beugrani? Erre nincs kitétel a C leírásban.
> Még az if esetén elmegy, de egy ciklusba igy belépni nem
> meghatározható jelenségekhez vezethet.
>
> és még nem ajálják a goto-t :-(), de eszerint hasonló
> meggondolatlanságot is el lehet követni, fordító álltal támogatott
> formában is!
>
> Nálam egy if feltétel mögé kéne beugrani, kirpóbáltam és lefordította és
> nem csak ezt... (de nem merem használni)
> Van erre valami ajánlás, szokvány vagy máshol ilyen felse merül?
Hát ez így biztosan nem szabványos. a GOTO-val nincs semmi baj, minden
program tele van goto-val (lefordítva gépi kódban), max. a felhasználó nem
látja :-)
Itt az a baj, hogy egy ciklusba ugrasz be, ahol egyrészt a fordító egy
ciklusváltozót inicializál, ami így kimarad, és így a kilépési feltételről
sem tudunk semmit, azaz nagy hülyeségek jöhetnek ki belőle.
Gondolm a case2 és case4 esetben csak egyszer kellene lefutnia a
ciklusnak, erre használhatsz inline fgv-t, vagy csinálhatod így is:
switch (v)
{
unsigned char x=0; //ezt hirtelen nem tudom ide lehet-e. Ha nem, akkor a
switch előtt kell defininálni+nullázni
case 1: if (feltetel) x=1;
case 2: if (x || (2==v)) { blabla };break;
case 3: x=100;
case 4: {if (!x) x=1;for (i=0;i<x;i++) { blabla};};break;
}
Ez így elméletileg működhet, csak ez se túl szép :-)
Üdv
--
Papp Zoltán
OneWay Electronics Kft
Hangszerviz
More information about the Elektro
mailing list