[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