C Forever

C : Interna - switch-case

Das "switch-case"-Konstrukt

switch( expression )
    {
    case const-expr:
        statements
    case const-expr:
        statements
    default:
        statements
    }

wird oft als eine der größten Fehlerquellen in C bezeichnet. Das liegt meiner Meinung nach aber hauptsächlich an dem schon von Kernighan und Richie benutzen Vergleich mit einer Abfolge von bedingten Verzweigungen :

if( expression == const-expr )
    statements
else if( expression == const-expr )
    statements
else if( expression == const-expr )
    statements
else                // default
    statements

Diese Äquivalenz ist natürlich das Ziel des "switch-case"-Konstrukts. Mit der obigen Definition wird sie allerdings nicht so ohne weiteres erreicht.
Tatsächlich gibt es zu dieser Definition des "switch-case"-Konstrukts kein einfaches Äquivalent.

Denn in "Prosa" beschrieben bedeutet das "switch-case"-Konstrukt folgendes :

Teste solange der Reihe nach die expression gegen die const-exprs bis du eine Übereinstimmung findest oder den default-Zweig erreichst.
Dann führe alle nachfolgenden Anweisungen im { }-Block der switch-Anweisung aus.

Daraus folgt : wenn man Äquivalenz zu dem Beispiel mit den if-Anweisungen erreichen will muss man jeden statements-Block explizit mit einem break oder return abschließen. Nur so wird der { }-Block der switch-Anweisung vor dem nächsten case-Zweig oder dem default-Zweig verlassen!

Andererseits ermöglicht die obige Defintion einen viel übersichtlicheren Ersatz des folgenden Konstrukts :

if( expression == const-expr )
    statements
else if( ( expression == const-expr ) || ( expression == const-expr ) || ( expression == const-expr ) )
    statements
else if( expression == const-expr )
    statements
else                // default
    statements

durch

switch( expression )
    {
    case const-expr:
        statements
        break;
    case const-expr:
    case const-expr:
    case const-expr:
        statements
        break;
    default:
        statements
        break;
    }

Das kann man auch noch weiter treiben :

switch( expression )
    {
    case const-expr:
        statements
        break;
    case const-expr:
        statements
        // Hier soll explizit mit dem nächsten case-Block fortgefahren werden.
        //  Das muss immer auffällig mit Angabe des Grundes dokumentiert werden, damit
        //  man später bei weiterem Arbeiten am Programm diese Stelle nicht übersieht!
    case const-expr:
        statements
        break;
    default:
        statements
        break;
    }

Diese Konstruktion ist die eigentliche Fehlerquelle bei der Verwendung von switch-case in C, aber auch ein Sprachkonstrukt, daß einem viele Möglichkeiten für kompakten Code eröffnet. Der Umgang damit sollte in den zu beachtenden Coding Style Guidelines festgelegt werden um jegliche Missverständnisse von vorneherein zu vermeiden.

Eine weitere Einschränkung gegenüber der Verwendung von if-Anweisungen darf man nicht vergessen :
die expression ebenso wie die const-expr müssen sich in einen intergralen Typ auflösen lassen. Also

Verletzt man diese Einschränkung sagt einem schon der Compiler bescheid.

© Uwe Jantzen [an error occurred while processing this directive]