Pourquoi ll'absence d'un break dans un switch fait tout executer

Pourquoi ll'absence d'un break dans un switch fait tout executer - C++ - Programmation

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
@+

Reply

Marsh Posté le 26-11-2002 à 12:40:00   

Reply

Marsh Posté le 26-11-2002 à 12:41:08    

:??:  
 
parce que c'est défini comme ca, c'est tout...

Reply

Marsh Posté le 26-11-2002 à 12:44:45    

:heink:  ok mais ça surprend car il y  quand meme le case devant chaque comparaison

Reply

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


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 26-11-2002 à 12:48:26    

Ben oui. C'est la définition du langage.
 
exemple :
 

Code :
  1. int a = 5
  2. switch(a)
  3. {
  4.   case 1: printf("1\n" );
  5.   case 2: printf("2\n" );
  6.   case 3: printf("3\n" );
  7.   case 4: printf("4\n" );
  8.   case 5: printf("5\n" );
  9.   case 6: printf("6\n" );
  10. }


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.

Reply

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.

Reply

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;


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

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
 

Reply

Marsh Posté le 26-11-2002 à 15:29:46    

ouais la même chose donc ;)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

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 ?

Reply

Marsh Posté le 26-11-2002 à 15:32:21   

Reply

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 :)

Reply

Marsh Posté le 26-11-2002 à 17:55:12    

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


---------------
du bon usage de rand [C] / [C++]
Reply

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 :
  1. void copy(short* to,short* from, int count)
  2. {
  3. int n=(count+7)/8;
  4. switch(count%8){
  5.  do{
  6. case 0: *to= *from++;
  7. case 7: *to= *from++;
  8. case 6: *to= *from++;
  9. case 5: *to= *from++;
  10. case 4: *to= *from++;
  11. case 3: *to= *from++;
  12. case 2: *to= *from++;
  13. case 1: *to= *from++;
  14.  }while(--n>0);
  15. }
  16. }


 
Ou même pire (exemple dénué de sens):

Code :
  1. switch(i){
  2. case 1:
  3. do1();
  4. if(t){
  5. default:
  6.  dodefault();
  7.  while(t){
  8. case 2:
  9.   do2();
  10.  }
  11. }
  12. }


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 27-11-2002 à 09:15:38    

Reply

Marsh Posté le 27-11-2002 à 09:16:14    

antp a écrit a écrit :

 :ouch:  




rassure toi, t'en verras jamais du comme ca (j'espere du moins)

Reply

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... :sarcastic:

Reply

Marsh Posté le 27-11-2002 à 19:58:00    

j'ouvre mon dico
 
"A device used to break or open an electric circuit"
 
donc faut se brancher et breaker  :D


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 28-11-2002 à 13:22:55    

Exemple de switch physique, si l'on suit ta définition :


       |
       o
      /|\
     / | \
     | | |


 :sarcastic:

Reply

Marsh Posté le 28-11-2002 à 13:24:51    

:p  :na:


---------------
du bon usage de rand [C] / [C++]
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed