44 votes

Est-il utile de cas à l'aide d'une instruction switch sans accolades?

Dans H&S5, j'ai rencontré le plus "bizarre" de l'instruction switch (8.7.1, p. 277) pas en utilisant des accolades.
Voici l'exemple:

switch (x)
    default:
    if (prime(x))
        case 2: case 3: case 5: case 7:
            process_prime(x);
    else
        case 4: case 6: case 8: case 9: case 10:
            process_composite(x);

L'idée semble être d'éviter la surcharge de l' prime(x) pour la plupart des petits nombres.

Quand j'ai vu ce document, j'ai été confus au sujet de la manque des accolades, mais la vérification de l'officiel de la grammaire (C1X la pré-norme, 6.8.4, p. 147), la syntaxe est correcte: Une instruction switch a juste une déclaration après le passage de l'expression et la parenthèse fermante.

Mais dans ma programmation, je n'ai jamais encore rencontré une telle curieux instruction switch (et je ne veux pas voir du tout dans le code que je dois prendre la responsabilité), mais j'ai commencé à me demander:

Tout de vous le savez, un interrupteur d'expression, l'une sans l'aide d'accolades, mais encore avoir un sens? Pas seulement switch (i); (ce qui est légal, mais un NOP), mais à l'aide d'au moins deux cas où des étiquettes ayant une sorte de but utile?

9voto

Jens Gustedt Points 40410

Si vous utilisez des structures de contrôle dans les macros d'un switch au lieu de if vient à portée de main car il n'a pas balançant else problème.

#define DEBUG_PRINT(...) switch (!debug_mode) case 0: fprintf(__VA_ARGS__)

Avec qui vous n'avez pas de surprises si un utilisateur de cette macro met dans une condition supplémentaire

if (unclear) DEBUG_PRINT(stderr, "This is really %unclear\n", unclear);
else {
 // do something reasonable here
}

Une telle debug macro a l'avantage d'être toujours compilé (et puis finalement optimisé out). Ainsi, le code de débogage doit rester valide par tous les temps en direct du programme.

Également observer ici qu'il est important que l' switch ne pas utiliser {}, sinon l' if/else exemple ne fonctionne pas non plus. Tout cela pourrait être atteint par d'autres moyens (if/else , (void)0 et do/while astuces), mais celui-ci est le plus pratique que je connaisse.

Et ne me prenez pas mal, je ne dis pas que tout le monde devrait utiliser les structures de contrôle à l'intérieur des macros, vous devrait certainement savoir ce que vous faites. Mais il y a des situations où c'est justifié.

1voto

Johan Bezem Points 1547

J'ai pensé à un autre cas.

Supposons que j'ai un compteur de type unsigned char en indiquant le nombre d'itérations d'une boucle, mais si le compteur est égal à zéro, il doit passer par la boucle 256 fois. Si mon raisonnement est correct, vous pouvez ce code comme suit:

uint8_t counter;
/* counter will get its value here somewhere */
switch (counter)
    default:
        while (0 < counter)
        {
            case 0:
                /* Perform action */
                counter--;
        }

Cela suppose bien sûr que dépassement de capacité de 0x00 résultats dans 0xFF pour un unsigned char. Mais il le fait pour tous mes environnements, même si le PC Peluches va se plaindre... Et oui, il contient des accolades, mais juste pour l' while, pas pour l' switch. Si vous savez quelque chose de mieux, permettez-moi de l'entendre!

Aurais-je programme comme celui-ci? Jamais!!!! ... eh bien, sur une petite 8 bits processeur j'ai même peut-être! :-)

0voto

Basile Starynkevitch Points 67055

Dans la pratique, les commutateurs sont utilisés avec des accolades (même Duff de l'appareil) pour des raisons de lisibilité. Et en ajoutant des accolades ne fait pas de mal.

0voto

stacker Points 34209

Section 6.8.4.2 L'instruction switch dit:

Une instruction de commutation de la commande de causes à sauter, dans, passé ou le déclaration qui est le corps de l'interrupteur, en fonction de la valeur d'un le contrôle de l'expression, et sur la présence d'un défaut de l'étiquette et de la les valeurs de tous les cas, les étiquettes sur ou dans le corps de l'interrupteur. Un cas ou d'un défaut l'étiquette est accessible uniquement à l'intérieur de la plus proche enfermant commutateur l'énoncé.

Les termes de l'interrupteur-corps et les plus proches enfermant interrupteur de la déclaration ne semblent pas exiger des accolades. Oui tu as raison, il semble bizarre, mais c'est légal. (N'a jamais vu ça avant)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X