Warum ist case statement innerhalb eines Blocks für einen anderen Fall erlaubt? [Duplikat]

8

Ich habe Code durchgelaufen, der so aussieht:

%Vor%

Beachten Sie, dass case 2 einen Block mit geschweifter Klammer öffnet, der erst nach case 3 geschlossen wird. Zunächst schien dies ein Tippfehler zu sein, der entweder einen Compilerfehler verursachte oder, noch schlimmer, case 3 ignorierte. Aber es funktioniert gut in C ++ und gibt 3 aus, wenn ich 3 bin. Ich komme von Java Hintergrund, so dass mein Verständnis von logischen Blöcken in C ++ fehlt. Meine Frage ist also: ist das bewusste Verhalten?

    
Denis Tulskiy 06.02.2017, 22:42
quelle

2 Antworten

9

Sie können, aber sollten Sie nicht, Case-Labels in einem switch weit schlimmer als das - und weit schlimmer als missbrauchen Duffs Gerät . Duffs Gerät hat das zweifelhafte Privileg, fast plausibel nützlich zu sein und kann dennoch als Missbrauch von switch angesehen werden.

Nicht jeder Missbrauch von switch kann plausibel als nützlich erachtet werden. Zum Beispiel kompiliert dies als C oder C ++, selbst wenn strenge Warnungen gesetzt sind:

%Vor%

Mit der Argumentbehandlung können Sie den Startwert festlegen, sodass Sie Ergebnisse reproduzieren können, wenn Sie möchten. Ich würde nicht behaupten, dass es nützlich ist; tatsächlich ist es nicht nützlich. Beachten Sie, dass break innerhalb der Schleifen die Schleife durchbricht, nicht switch .

Grundsätzlich müssen case labels (und default ) im Bereich von switch liegen und mit dem innersten einschließenden switch verknüpft sein. Es gibt einige andere Einschränkungen für sie. Sie müssen darauf achten, nicht über Variableninitialisierungen usw. zu springen (deshalb sind j und k außerhalb von switch() definiert). Aber ansonsten sind sie nur Etiketten, und die Kontrolle wird zu ihnen fließen, wenn sie "angemessen" ist.

    
Jonathan Leffler 06.02.2017 23:04
quelle
5

switch Anweisung in C / C ++ ist eine verherrlichte goto Anweisung (mit einigen Optimierungsvorteilen).

Als Ergebnis können Sie mit case labels genauso viel machen wie mit goto labels. Insbesondere wird in dem Block springen erlaubt, solange Sie keine variable Initialisierung werden umgangen wird.

    
SergeyA 06.02.2017 23:01
quelle

Tags und Links