Pourquoi ll'absence d'un break dans un switch fait tout executer - C++ - Programmation
Marsh Posté le 26-11-2002 à 12:44:45
ok mais ça surprend car il y quand meme le case devant chaque comparaison
Marsh Posté le 26-11-2002 à 12:48:05
bhen faut bien montrer qu'il s'agit d'un nouveau cas et non de l'instruction suivante du cas précédent
Marsh Posté le 26-11-2002 à 12:48:26
Ben oui. C'est la définition du langage.
exemple :
Code :
|
Ca va t'afficher 5 et 6, tout n'est pas exécuté, mais tout a partir du cas donné. Le break permet de sortir d'un bloc quel qu'il soit, ca marche avec les boucles, mais aussi avec le switch. En gros, tu sors pour ne pas executer ce qui suit.
Marsh Posté le 26-11-2002 à 12:50:44
Y a des fois où ça peut même servir !!
Quand on vient de BASIC, on est habitué à ce que chaque CASE soit "autonome" mais en C, comme dit lorill, c'est défini comme ça. On continue tant que pas fin du switch ou pas break rencontré.
Si on a
switch (iOption)
{
case 0:
case 1:
case 2:
ExecuteBidule(iOption);
case 3:
case 4:
case 5:
case 6:
ExecuteAutreBidule(iOption);
break;
default:
FaitPresqueRien(iOption);
}
ça évite de répéter le code pour chaque case, ou de faire des super if( && && ).
0, 1, 2 exécutent Bidule d'abord puis Autrebidule, mais 3,4,5,6 que le second.
Marsh Posté le 26-11-2002 à 13:42:54
carbon_14 a écrit a écrit : Quand on vient de BASIC, on est habitué à ce que chaque CASE soit "autonome" |
En Pascal aussi
carbon_14 a écrit a écrit : switch (iOption) { case 0: case 1: case 2: ExecuteBidule(iOption); case 3: case 4: case 5: case 6: ExecuteAutreBidule(iOption); break; default: FaitPresqueRien(iOption); } ça évite de répéter le code pour chaque case, ou de faire des super if( && && ). 0, 1, 2 exécutent Bidule d'abord puis Autrebidule, mais 3,4,5,6 que le second. |
bah en Basic y a pas moyen de faire comme en Pascal ?
case iOption of
0..2:
ExecuteBidule(iOption);
3..6:
ExecuteAutreBidule(iOption);
else
FaitPresqueRien(iOption);
end;
Marsh Posté le 26-11-2002 à 15:26:25
En Quick/Q/Visual Basic, on ferait (de mémoire)
select case iOption
case 0, 1, 2
ExecuteBidule(iOption);
ExecuteAutreBidule(iOption);
rem on sort du select case
case 3, 4, 5, 6
ExecuteAutreBidule(iOption);
rem on sort du select case
case else
FaitPresqueRien(iOption);
end select
Marsh Posté le 26-11-2002 à 15:29:46
ouais la même chose donc
Marsh Posté le 26-11-2002 à 15:32:21
Hooo... un vincent grosméthos !!
ça va bien ?
Alors maintenant t'es en cours ? décidément, j'ai du mal à te suivre toi ! tu fais quoi du coup ?
Marsh Posté le 26-11-2002 à 17:26:40
bon rien avoir avec le prog....desolé pour les autres...
Pour le gringo, aprés 8mois chez Lecler (dev appli ASP), mon CDD c'est terminé...avec pas de projet derrier..
Donc je me suis inscrit à la fac en cours du soir C++/Java...
Au mois decembre je repare sur un CDD de 1mois..voir 1mois et demie pour une agence web...mais je developpe à la maison cette fois çi
Si non dans la maison ou j'habite actuellement je travail sur un projet de jeu de salle en resaux...avec des petites subventions europpenes qui vont bien..fin si le dossier passe...
Voila tu sais tout!!
Et toi t'en sort avec le ged
Marsh Posté le 27-11-2002 à 02:23:18
Le C est un peu particulier.
Les "case" fonctionnent à la manière d'étiquettes, et le "switch" comme un goto multiple (bien qu'il n'y ait pas compatibilité avec goto).
Le bloc-accolade du switch est donc presque banal avec du code linéaire.
On peut d'ailleurs faire des trucs ignobles, comme avec goto.
Duff's device
Code :
|
Ou même pire (exemple dénué de sens):
Code :
|
Marsh Posté le 27-11-2002 à 09:15:38
ReplyMarsh Posté le 27-11-2002 à 09:16:14
antp a écrit a écrit : |
rassure toi, t'en verras jamais du comme ca (j'espere du moins)
Marsh Posté le 27-11-2002 à 11:05:47
Taz@PPC a écrit a écrit : un switch c'est bien ce que ca veut dire, un branchement conditionnel: une fois rentré, à moins de breaké, toutes les instructions sont exécutées |
Non, ça ne veut rien dire. Les créateurs de C ont choisi ce comportement, mais il n'est pas plus logique qu'un autre. Et très clairement, il est moins intuitif que le branchement exclusif.
D'ailleurs, si le switch était implémenté comme une table de fonction, on trouverait totalement illogique le comportement du switch C...
Marsh Posté le 28-11-2002 à 13:22:55
Exemple de switch physique, si l'on suit ta définition :
|
Marsh Posté le 26-11-2002 à 12:40:00
Salut
Mon prof , juste à titre informatif, nous a montré que l'absence d'un break dans un block switch, fait que tous les cas sont executés..
Si quelqu'un sait pourquoi..je lui trnasmettrais la reponse
Merci
@+