Je lisais Pourquoi devons-nous utiliser break
dans switch
? , et cela m'a amené à me demander pourquoi le passage implicite est autorisé dans certains langages (tels que PHP et JavaScript), alors qu'il n'y a pas de support (AFAIK) pour le passage explicite.
Ce n'est pas comme si un nouveau mot clé devait être créé, ce continue
qui serait parfaitement approprié, et résoudrait tout problème d'ambiguïté quant à savoir si l'auteur voulait qu'un cas tombe.
Le formulaire actuellement pris en charge est:
switch (s) {
case 1:
...
break;
case 2:
... //ambiguous, was break forgotten?
case 3:
...
break;
default:
...
break;
}
Attendu qu'il serait logique qu'il soit écrit comme suit:
switch (s) {
case 1:
...
break;
case 2:
...
continue; //unambiguous, the author was explicit
case 3:
...
break;
default:
...
break;
}
Pour les besoins de cette question, ignorons la question de savoir si les relais sont un bon style de codage.
Existe-t-il des langages qui permettent le basculement et le rendent explicite?
Y a-t-il des raisons historiques qui switch
permettent une chute implicite plutôt qu'explicite?
switch-statement
zzzzBov
la source
la source
goto case
, donc la prémisse de votre question est un peu fausse.goto case
en C #.goto case
, comme le mentionne pdr.Réponses:
C'est principalement historique, la plupart des langages ont juste copié ce que C a fait.
La raison pour laquelle C l'a fait de cette façon est que les créateurs de C voulaient que les instructions de commutation soient faciles à optimiser dans une table de saut. C'est également la raison pour laquelle C limite les instructions de commutation aux valeurs intégrales.
Dans une table de sauts, le programme calculera la position vers laquelle sauter en fonction de l'expression. Le programme va sauter à ce point puis continuer à s'exécuter à partir de ce point. Si vous voulez sauter le reste du tableau, vous devez inclure un saut à la fin du tableau. C utilise des
break
instructions explicites pour qu'il y ait une correspondance directe avec cette construction.la source
break
et seulement moins de 3% étaient de chute. . Il a ensuite utilisé cela comme exemple que le comportement de défaut par défaut est contre-intuitif et qu'il serait préférable qu'il soit inversé (utilisez un mot-clé pour indiquer un passage explicite). Oh, et le livre est vraiment excellent pour expliquer d'autres bizarreries de C aussi, dont certaines se trouvent en C ++ et même en C # et Java aussi! Tout est enraciné dans B et BCPL. :)case
, autre que la première, devrait être automatiquement préfixéebreak
, mais pas celles marquées+case
(ou un autre tel). Cela aurait été facile à gérer pour un compilateur et aurait permis les avantages sémantiques du présent arrangement, tout en éliminant de nombreuses lignes de code.Go permet une reprise explicite à l'aide du
fallthrough
mot clé (break est implicite, mais peut être explicite):Voici le morceau pertinent de go efficace et la spécification de langue .
Je ne pense pas que vous puissiez utiliser
goto
pour accéder à un cas spécifique, mais vous pouvez créer une étiquette à l'intérieur du boîtier et utiliser unegoto
norme similaire.En prime, Go vous permet d'utiliser des expressions binaires, des chaînes ou des types dans un commutateur en tant qu'instructions de cas.
la source