Forum: Compiler & IDEs Frage zu Switch-Anweisung


von Max (Gast)


Lesenswert?

Hallo Leute!

Ich habe eine Frage zur Switch-Anweisung und zwar zu dem Fall, dass die 
default-Anweisung vor einem "case" steht.
Jetzt habe ich folgenden Beispielcode in einem C-Tutorial gefunden, und 
bin mir nicht sicher ob die Erklärung richtig ist:
(Das Beispiel stammt von http://www.peacesoftware.de/ckurs7.html)
1
x = 99;
2
switch(x)
3
{
4
  default:
5
      y = 0;
6
7
   case 1:
8
      mychar = 'a';
9
   break;
10
11
   case 2:
12
      y = 42;
13
      mychar = 'b';
14
   break;
15
}

Dazu stand im Tutorial folgende Erklärung:

"In diesem kurzen Beispiel steht die default Anweisung oben und wird 
nicht mit einem break beendet. Da beide folgenden cases nicht zutreffen, 
wird der default block zuerst ausgeführt, es wird y gleich Null gesetzt. 
Da kein break vorhanden ist, wird die nächste Anweisung, mychar = 'a'; 
auch ausgeführt. Danach steht break und es ist Schluß."

Jetzt meine Frage:
Dass der default-Zweig betreten wird ist klar, und weil dieser keine 
break-Anweisung enthält, läuft das Programm weiter zu "case 1:". Aber: 
warum wird dieser Teil betreten und mychar = 'a' ausgeführt? Ist das ein 
Fehler in der Erklärung oder eine Verständnisfrage meinerseits?

Ich persönlich habe bis jetzt default-Anweisungen nur am Ende von 
switch- Statements eingefügt, da es so meiner Meinung nach 
übersichtlicher und üblich ist. Auf diesen Fall bin ich beim Einlesen in 
einen fremden Code gestoßen und wollte jetzt recherchieren wie sich das 
Programm verhält.

Vielen Dank für Eure Hilfe

Max

von Karl H. (kbuchegg)


Lesenswert?

Max schrieb:

> Dass der default-Zweig betreten wird ist klar, und weil dieser keine
> break-Anweisung enthält, läuft das Programm weiter zu "case 1:". Aber:
> warum wird dieser Teil betreten und mychar = 'a' ausgeführt?

Weil da kein break steht.

Die 'case' sind Einstiegspunkte in eine Codesequenz. Aber das 
Auflaufen auf den nächsten case bedeutet nicht, dass dadurch die Sequenz 
abgebrochen würde. Erst der break macht das. Und da im 'default' Zweig 
kein break steht, geht die Programmausführung weiter, bis zum nächsten 
break.

> Ich persönlich habe bis jetzt default-Anweisungen nur am Ende von
> switch- Statements eingefügt, da es so meiner Meinung nach
> übersichtlicher und üblich ist.

Aber in diesem Fall hat der Programmierer einen Grund, warum er den 
default vorzieht. Er will etwas ausführen lassen und danach genau den 
gleichen Code ausgeführt haben, wie wenn der case 'a' genommen worden 
wäre.

von Carsten W. (eagle38106)


Lesenswert?

Der obenstehende Code macht doch eigentlich das hier:
1
x = 99;
2
3
switch(x)
4
{
5
  case 1:
6
    mychar = 'a';
7
    break;
8
  case 2:
9
    y = 42;
10
    mychar = 'b';
11
    break;
12
  default:
13
    y = 0;
14
    mychar = 'a';
15
    break;
16
}

Das Einfügen des default-Zweiges am Anfang der Anweisung ist in der Tat 
unüblich. Für ein Tutorial ein ziemlich mieses Code-Beispiel.

von Karl H. (kbuchegg)


Lesenswert?

Carsten Wille schrieb:

> unüblich. Für ein Tutorial ein ziemlich mieses Code-Beispiel.


Nicht wirklich.
Der Autor hat vorher die üblichen Dinge über switch-case erzählt. Und 
ganz zum Schluss hat er dann ein Beispiel konstruiert, in dem beide 
Dinge, weglassen von break, und umordnen der cases (auch default ist ja 
nichts anderes als ein case) gezeigt. Er weist extra darauf hin und 
bringt es erst, nachdem er den switch-case besprochen hat.

Abgesehen davon, ist es halt das übliche Online-Tutorial: Die Hälfte 
fehlt bzw. wird nicht angesprochen, Dinge werden nicht erklärt sondern 
sind lauf Autor 'anschaulich klar', etc. Wie bei den meisten Tutorials, 
die ich mir bisher angesehen habe: Kein Vergleich mit einem Buch.

von Peter D. (peda)


Lesenswert?

Man muß sich das Switch-Case als ein GOTO vorstellen.

Die Case (Labels) können daher völlig beliebig angeordnet werden 
innerhalb des Switch-Ausdrucks.
Man kann auch einen Case innerhalb einer Bedingung oder einer Schleife 
schreiben.


Peter

von Loonix (Gast)


Lesenswert?

Carsten Wille schrieb:

> unüblich. Für ein Tutorial ein ziemlich mieses Code-Beispiel.

Finde ich nicht. Siehe:

Peter Dannegger schrieb:
> Man muß sich das Switch-Case als ein GOTO vorstellen.

100-Punkte-Antwort, bzw. ein aus meiner Sicht absolut sinniges 
Statement. Ein Case prüft nicht ob er ausgeführt werden darf, er wird 
einfach "angesprungen" - wie ein herkömmliches Label. Geprüft wird 
lediglich der switch.

von Karl H. (kbuchegg)


Lesenswert?

Siehe "Duffs Device"

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.