kann man switch-case mit if-then "mischen" ?

Gast #368030
Lesenswert?
• ▲
▼
Hi,

geht so etwas prinzipiel:

switch ( foo )
{
   if ( Bedingung )
    {
      case A:
       .... irgendwas;
       break;
      case B:
       .... was anderes;
       break;
    }
   case C:
       ... noch was anderes;
       break;
   default:
       break;
}

die "case A bzw. case B" sollen nur bewertet werden wenn die
Bedingung  hinter dem if zutrifft.

ich habs zwar gerade mal ausprobiert, der Compiler hat auch nicht
gemeckert, das was passieren sollte ist aber auch nicht passiert.
deswegen bin ich mir nun etwas unsicher ...

Grüße,
    Stefan
Gast #368032
Lesenswert?
• ▲
▼
Wobei Duff den code zwischen die cases schreibt, und nicht anders herum.
Der oben beschriebene code wird die if Abfrage wohl nie ausfuehren. Im
Prinzip stellen die cases unter der Decke goto statements dar, und das
kann man, wie Joerg beschreibt, fuer uebelste Spielchen benutzen.

Joerg, die Formulierung 'write-only code' muss ich mir merken.
Gnihihi.
Gast #368033
Lesenswert?
• ▲
▼
... an das Duff's device erinnere ich mich.

naja, ok, ich muss es so nicht machen, es wäre jedoch an der Stelle
"relativ" elegant gewesen.

leider passiert genau das was TheDaz schreibt.

Der Kernigham hatte dazu nichts verlautbahrt. Da dachte ich mir - ich
frag mal jemanden der sich damit auskennt.

Das Kapitel "Write-Only-Code" Versuche ich durch reichlich Komentare
zu vermeiden - sonst weis ich ja hinterher selbst nicht mehr was und
warum ich da gemacht habe.

Grüße,
Stefan
#368034
Lesenswert?
• ▲
▼
"Im Prinzip stellen die cases ... goto statements dar"

Jau, genau so isses !

Man kann also alles das machen, was mit goto möglich wäre.

Und da vor dem if kein case (label) steht, wird es also nie ausgeführt.
Der Compiler wird das if also einfach wegoptimieren, da toter Code.

Und default muß auch nicht am Ende stehen.


Peter

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren