Instruction de commutation: par défaut doit être le dernier cas?

De considérer les éléments suivants switch déclaration:

switch( value )
{
  case 1:
    return 1;
  default:
    value++;
    //fall-through
  case 2:
    return value * 2;
}

Ce code compile, mais est-il valable (= comportement défini) pour C90/C99? Je n'ai jamais vu de code où le par défaut cas n'est pas le dernier cas.

EDIT:

Comme Jon Cage et KillianDS écrire: c'est vraiment laid et du code source de confusion et je suis bien conscient. Je suis juste intéressé par la syntaxe générale (est-il défini?) et la sortie attendue.

  • +1 même Jamais considéré que le comportement
  • Török: vous voulez dire que si la valeur == 2, il sera de retour le 6 ?
  • Il y a quelque chose de très goto (et donc mal) sur l'utilisation de ce comportement - je vous conseille de l'éviter.
  • Török non, l'ordre n'a pas d'importance - si la valeur correspond à la constante en tout cas, l'étiquette, puis contrôle de sauter à la déclaration à la suite de l'étiquette, sinon le contrôle saute à l'instruction qui suit l'étiquette par défaut si elle est présente.
  • Je suis d'accord avec Jon Cage, c'est pas vraiment un code lisible. À mon humble avis, fall-through sont toujours source de confusion, ce qui le rend encore pire. Me le dicton "les Programmes doivent être écrits pour les gens à lire, et accessoirement seulement pour les machines à exécuter." correspond ici à la perfection.
  • Cage goto n'est pas mal. Culte du Cargo disciples sont! Vous ne pouvait pas imaginer à quelles extrémités les gens peuvent aller pour éviter goto parce qu'il aurait soi-disant été tellement mal, de faire une réelle illisible désordre de leur code.
  • Peut-être evil était un mauvais choix de mots, peut-être easily abused ou easily misunderstood. Il n'y a pas de raison d'éviter goto doit conduire à moins lisible du code et, en général, si vous avez besoin d'goto que je vous suggère c'est un signe que le code de code à être mieux structuré, en premier lieu. Si vous avez des exemples concrets qui réfuter mon point je serais vraiment intéressé de voir. Je ne suis pas dénigrer ici, j'ai juste eu à corriger quelques vilains bugs causés par goto et similaires langue des constructions dans le passé 🙂
  • J'utilise goto principalement pour simuler quelque chose comme un finally clause dans les fonctions de, où les ressources (fichiers, de mémoire) doivent être libérés au moment de l'arrêt, et à répéter pour chaque cas d'erreur une liste de free et close n'aide pas pour des raisons de lisibilité. Il y a bien une utilisation de goto que je voudrais éviter, mais ne peut pas, c'est quand je veux sortir d'une boucle et je suis dans un switch dans cette boucle.
  • La meilleure question que jamais! Votre question est résolue par tout le monde ici. Votre question indirecte (devrais-je?) il est répondu indirectement par le nombre de gens qui sont venus ici et ont fait valoir. Maintenant, si vous faites cela dans le code, vous le faites en dépit d'être demandé de ne pas par de nombreux développeurs qui ont à lire le code. Son terrible pratique parce que beaucoup de gens seront assez confus pour mettre fin à stackoverflow quand ils voient votre code. Toute prestation est mineur, au mieux, et probablement douteuse. Coût-bénéfice est très faible. Aussi, ne le faites pas parce que par défaut est une exception à la règle. par défaut est étrangement différent cas.
  • oui, c'est très intéressant de voir comment beaucoup de gens sont aguing à ce sujet ou ne sont pas sûrs de ce qui se passe ici. Rien que cela est un indice sérieux de ne pas utiliser cette pratique. Évidemment, beaucoup de gens ne peuvent pas lire ou comprendre ce code (y compris moi avant j'ai demandé à cette question).

InformationsquelleAutor tanascius | 2010-06-24