Forum: Compiler & IDEs kann man switch-case mit if-then "mischen" ?


von Stefan Sczekalla (Gast)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Gucke dir mal "Duff's device" an und frage dich dann, ob du
derartigen Code wirklich haben willst. ;-)

Ja, mischen kann man das, aber das wird write-only code.

von The Daz (Gast)


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.

von Stefan Sczekalla (Gast)


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

von Peter D. (peda)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.