was hinter "case" steht, heißt nicht umsonst "label": es ist eine verkappte Sprungadresse, genau wie bei goto. Dabei wird der Wert der Bedingung mit der Label/Sprungmarke verknüpft/assoziiert.
Von der Logik her ist es natürlich vergleichbar mit if/else-Ketten, mit dem Unterschied, dass hier kein "break" nötig ist nach jeder logischen Bedingung
- was wieder darauf zurückzuführen ist, dass vor der nächsten case-label/Sprungmarke per "break" ans Ende vom "switch"-Block gesprungen werden muss, ebenfalls genau wie bei reinen aneinandergereihten goto Sprungmarken:
täte man das nicht, würde weiter einfach zeilenweise der Code schrittweise weiter abgearbeitet werden, direkt in den nächsten case-"Körper" hinein, ebenfalls genau wie bei kaskadierten goto-Befehlen, auch hier würde einfach über das kommende Label hinweggelesen, in die dann folgenden Anweisungen "hinein".
Man müsste sich wahrscheinlich wirklich mal die Mühe machen, den nackten Maschinencode zu untersuchen, den ein C und auch ein C++ Compiler aus switch/case, goto und if/else-Ketten/Blöcken macht, aber allein schon der Unterschied, dass case (genau wie goto) nur Konstanten als Labels erlaubt (1,2,3,4...), während if/else jedes logische Statement zulässt (<2, >=2 und <3.999, >=4...), zeigt schon die Ähnlichkeiten von goto und switch/case und den Unterschied zu if/else (letzteres ist allerdings genau das, was ich selber bevorzuge, wegen der größeren Möglichkeiten und Mächtigkeit dieses Konstrukts, ohne dabei aber auf goto zu verzichten; switch/case hingegen ist IMO das "allerletzte" wegen der Beschränkung auf Integer-Konstanten und dem nervtötenden "break" zwischen den Sprungmarken).
Lesezeichen