De nombreuses réponses semblent se concentrer sur la capacité à échouer comme raison d'exiger la break
déclaration.
Je pense que c'était simplement une erreur, en grande partie parce que lorsque C a été conçu, il n'y avait pas autant d'expérience avec la façon dont ces constructions seraient utilisées.
Peter Van der Linden en fait la démonstration dans son livre "Expert C Programming":
Nous avons analysé les sources du compilateur Sun C pour voir à quelle fréquence la chute par défaut était utilisée. Le serveur frontal du compilateur Sun ANSI C comporte 244 instructions de commutation, chacune contenant en moyenne sept cas. La chute se produit dans seulement 3% de tous ces cas.
En d'autres termes, le comportement normal du commutateur est erroné 97% du temps. Ce n'est pas seulement dans un compilateur - au contraire, là où la chute a été utilisée dans cette analyse, c'était souvent pour des situations qui se produisent plus fréquemment dans un compilateur que dans d'autres logiciels, par exemple, lors de la compilation d'opérateurs qui peuvent avoir un ou deux opérandes :
switch (operator->num_of_operands) {
case 2: process_operand( operator->operand_2);
/* FALLTHRU */
case 1: process_operand( operator->operand_1);
break;
}
La chute de cas est si largement reconnue comme un défaut qu'il y a même une convention spéciale de commentaire, illustrée ci-dessus, qui dit à la charpie "c'est vraiment l'un de ces 3% des cas où la chute était souhaitée."
Je pense que c'était une bonne idée pour C # d'exiger une instruction de saut explicite à la fin de chaque bloc de cas (tout en permettant l'empilement de plusieurs étiquettes de cas - tant qu'il n'y a qu'un seul bloc d'instructions). En C #, vous pouvez toujours faire passer un cas à un autre - il vous suffit de rendre explicite la chute en passant au cas suivant en utilisant un goto
.
C'est dommage que Java n'ait pas profité de l'occasion pour rompre avec la sémantique C.
À bien des égards, c est juste une interface claire pour les idiomes d'assemblage standard. Lors de l'écriture d'un contrôle de flux piloté par une table de saut, le programmeur a le choix de passer ou de sauter hors de la "structure de contrôle", et un saut en sortie nécessite une instruction explicite.
Alors, c fait la même chose ...
la source
NULL
. (Suite dans le prochain commentaire.)NUL
chaînes terminées sont à peu près la pire idée qui soit.DO
boucle Fortran .Pour implémenter le dispositif de Duff, évidemment:
la source
Si les cas étaient conçus pour se rompre implicitement, vous ne pourriez pas avoir de retombée.
Si le commutateur était conçu pour éclater implicitement après chaque cas, vous n'auriez pas le choix. La structure du boîtier de commutation a été conçue de manière à être plus flexible.
la source
Les instructions case dans une instruction switch sont simplement des étiquettes.
Lorsque vous activez une valeur, l'instruction switch effectue essentiellement un aller à l'étiquette avec la valeur correspondante.
Cela signifie que la rupture est nécessaire pour éviter de passer au code sous l'étiquette suivante.
Quant à la raison pour laquelle elle a été implémentée de cette manière - la nature fall-through d'une instruction switch peut être utile dans certains scénarios. Par exemple:
la source
break
endroit où il est nécessaire. 2) Si l'ordre des instructions de cas est modifié, le basculement peut entraîner l'exécution du mauvais cas. Ainsi, je trouve la gestion de C # bien meilleure (explicitegoto case
pour le fallthrough, sauf pour les étiquettes de cas vides).break
en C # - le plus simple est quand vous ne voulezcase
pas faire quoi que ce soit, mais oubliez d'ajouter unbreak
(peut-être avez-vous été tellement absorbé par le commentaire explicatif, ou avez-vous été appelé sur certains autre tâche): l'exécution tombera simplement encase
dessous. 2) encourageantgoto case
est encourageant le codage «spaghetti» non structuré - vous pouvez vous retrouver avec des cycles accidentels (case A: ... goto case B; case B: ... ; goto case A;
), surtout lorsque les cas sont séparés dans le fichier et difficiles à combiner. En C ++, le fall-through est localisé.Pour autoriser des choses comme:
Considérez le
case
mot - clé comme unegoto
étiquette et cela vient beaucoup plus naturellement.la source
if(0)
à la fin du premier cas est maléfique et ne devrait être utilisé que si l'objectif est d'obscurcir le code.Il élimine la duplication de code lorsque plusieurs cas doivent exécuter le même code (ou le même code en séquence).
Étant donné qu'au niveau du langage d'assemblage, peu importe si vous coupez entre chacun d'eux ou non, il n'y a de toute façon aucune surcharge pour les cas de chute, alors pourquoi ne pas les autoriser car ils offrent des avantages significatifs dans certains cas.
la source
Je suis tombé sur un cas d'assignation de valeurs dans des vecteurs à des structures: cela devait être fait de telle manière que si le vecteur de données était plus court que le nombre de membres de données dans la structure, le reste des membres resterait dans leur valeur par défaut. Dans ce cas, l'omission
break
était très utile.la source
Comme beaucoup l'ont spécifié ici, il s'agit de permettre à un seul bloc de code de fonctionner pour plusieurs cas. Ce devrait être une occurrence plus courante pour vos instructions switch que le "bloc de code par cas" que vous spécifiez dans votre exemple.
Si vous avez un bloc de code par cas sans échec, vous devriez peut-être envisager d'utiliser un bloc if-elseif-else, car cela semblerait plus approprié.
la source