web-dev-qa-db-fra.com

déclaration 'break' lors de l'utilisation d'accolades dans un boîtier de commutateur

J'utilise des accolades avec toutes mes déclarations de cas de commutation en C/Objective-C/C++

Il y a quelques instants, je ne m'étais jamais demandé si l'inclusion de l'instruction break; à l'intérieur des accolades était une bonne ou une mauvaise pratique. Je soupçonne que cela n’a aucune importance, mais j’imagine que cela vaut toujours la peine de demander.

    switch (foo) {
        case 1: {
            // stuff
            break;
        }

        default: {
            break;
        }
    }

contre

    switch (foo) {
        case 1: {
            // stuff
        } break;

        default: {
            // stuff
        } break;
    }
37
griotspeak

Réponse courte: peu importe.

26
Oliver Charlesworth

Juste un donner une réponse un peu plus détaillée ...

La spécification officielle C99 dit ce qui suit à propos de la déclaration de rupture:

Une instruction break met fin à l'exécution de la plus petite instruction de commutateur ou d'itération englobante.

Donc, ce n'est pas grave. Quant à moi, je mets la pause à l'intérieur des accolades. Étant donné que vous pouvez également effectuer des pauses à d’autres endroits à l’intérieur de vos accolades, il est plus logique d’avoir également la fin de la pause à l’intérieur des accolades. Un peu comme la déclaration de retour.

10
gregschlom

Il existe une multitude de styles de codage différents sur la manière de combiner des accolades et des commutateurs. Je vais utiliser celui que je préfère dans les exemples. L'instruction break sort de l'instruction de boucle ou de commutateur la plus interne, quel que soit son emplacement. Vous pouvez par exemple avoir plusieurs pauses pour un seul cas:

switch (foo) {
case 1:
    {
        if (bar)
            break;
        bar = 1;
        ...
    }
    break;
}

Notez que vous pouvez également mettre les cas n'importe où, bien que soit plutôt considéré comme une mauvaise pratique. L'étiquette de cas ressemble beaucoup à une étiquette de goto. Il est arrivé que j'ai écrit quelque chose comme ceci:

switch (foo) {
case 1:
    bar = 1;
    if (0) {
case 2:
        bar = 2;
    }
    ...
    break;
}

mais utilisez-le avec précaution.

5
Per Johansson

Vous ne voulez probablement pas les curlies en premier lieu, sauf si vous en avez besoin pour une portée lexicale. Le premier exemple me semble plus beau, mais je suppose que la vraie réponse est que c'est une question de goût.

1
Dagg Nabbit

Comme il est clairement indiqué, il s’agit là d’une question de style personnel, mais j’ai toujours placé la déclaration de rupture hors des accolades: mettre la pause avant l’accolade de clôture me semble dépasser une déclaration composée, augmentant ainsi légèrement l’impression de code spaghetti.

0
Zac