Règle switch case

pyfpafpouf Messages postés 6 Date d'inscription   Statut Membre Dernière intervention   -  
Sugel Messages postés 4076 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
j'aurais aimé savoir s'il est possible d'imbriquer une fonction void() à l'intérieur d'un switch case.
Petit exemple:
switch(choix)
{
case 1: fonction1();
break;

case 2: fonction2();
break;
.....

et est on obligé de mettre un "default" à la fin ?, si les conditions ne peuvent qu'être respectées ?

Merci d'avance !
A voir également:

3 réponses

Dalfab Messages postés 706 Date d'inscription   Statut Membre Dernière intervention   101
 
Bonjour,
On met le code que l'on veut dans un switch/case.
Le default n'est pas obligatoire, et peut être utilisé n'importe où, moi je le met souvent au début. Si pas de default, les cas non demandés seront ignorés comme si on avait fait default:break;.
1
pyfpafpouf Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
Ok merci beaucoup !
0
pyfpafpouf Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
Donc ça veut dire que si le switch case est dans un sous programme, on peut renvoyer ce même sous programme à un autre sous programme ?
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
@pyfpafpouf : explique ce que que tu veux dire par "sous-programme", ce n'est pas vraiment un concept du C.
0
Sugel Messages postés 4076 Date d'inscription   Statut Membre Dernière intervention   727
 
pour rendre le truc un peu plus clair:
un switch case comme ça:
int val = random();
printf("the value of val is : %d", val);

switch (val)
{
case 0:
  printf("val should be 0: %d\n", val);
  break;
case 1:
  printf("val should be 1 then fallback to default: %d\n", val);
default:
  printf("default case !");
  break; // this break isn't mandatory as default is at the end
}


est vaguement équivalent à ça:
int val = random();
if (val == 0)
  goto case0;
else if (val == 1)
  goto case1;
else
  goto caseDefault;

case0:
printf("val should be 0: %d\n", val);
goto caseEnd;

case1:
printf("val should be 1 then fallback to default: %d\n", val);

caseDefault:
printf("default case !");
// goto caseEnd; // this is equivalent to writting a break in the last block of a switch
caseEnd:


Cette syntaxe est évidemment moins lourde, permet d'éviter l'usage de gotos, bien souvent injustifiée grâce aux cases, et est surtout beaucoup moins redondante.

De plus, les switch case permettent au compilateur d'effectuer des optimisations plus facilement qu'avec des ifs et des gotos.

J'ai pas écris ce code pour qu'il soit reproduit, juste pour que tu comprennes le comportement des switch.

Avant d'écrire un message, pensez que nous sommes là par passion, et par espoir de vous la communiquer: Si c'est pas génial, ça !
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Cette syntaxe est évidemment moins lourde, permet d'éviter l'usage de gotos, bien souvent injustifiée grâce aux cases, et est surtout beaucoup moins redondante.
Heu. Le switch case ne sert pas à éviter l'usage de gotos. Cela sert juste à rendre la syntaxe moins lourde.
Ta version "switch", perso je la traduis plutôt par :
int val = random();
printf("the value of val is : %d", val);
if (val == 0)
  printf("val should be 0: %d\n", val);
else if (val == 1)
  printf("val should be 1 then fallback to default: %d\n", val);
else
  printf("default case !");
0
Sugel Messages postés 4076 Date d'inscription   Statut Membre Dernière intervention   727
 
hm, ok, mais le switch a un cadre d'utilisation différent des ifs.
Ta version n'est d'ailleurs pas équivalente, le cas val == 1 ne retombe pas dans le default.

Et en soi, un switch, c'est juste un goto plus cadré, et je ne pense pas me tromper en disant que ça évite l'usage de goto dans le cas particulier où l'on a besoin de fallback d'un cas à un autre.

après on peut écrire un exemple sans fallback, traduisible facilement vers une séquence de ifs.
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
mais le switch a un cadre d'utilisation différent des ifs.
Non. C'est pareil, cela permet juste de simplifier l'écriture (ce qui est important).

Ta version n'est d'ailleurs pas équivalente, le cas val == 1 ne retombe pas dans le default.
Certes, j'avais pas vu que ton exemple était différent de l'énoncé.
La non-utilisation du break complique à peine la traduction en if :
int val = random();
printf("the value of val is : %d", val);
if (val == 0)
  printf("val should be 0: %d\n", val);
else if (val == 1)
  printf("val should be 1 then fallback to default: %d\n", val);
else if (val != 0)
  printf("default case !");

Une fois encore. switch ne sert pas à éviter l'usage de goto... C'est exactement la même logique que le if sauf qu'il est plus simple et permet moins de chose que le if. C'est tout...

Et en soi, un switch, c'est juste un goto plus cadré, et je ne pense pas me tromper en disant que ça évite l'usage de goto dans le cas particulier où l'on a besoin de fallback d'un cas à un autre.
Pas du tout. Tu trouveras toujours l'équivalent en if sans goto. Toujours. Mais certainement en moins lisible dans l'écriture des conditions.
0
Sugel Messages postés 4076 Date d'inscription   Statut Membre Dernière intervention   727 > fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention  
 
mais non, ton code n'est toujours pas équivalent !
fais un test, tu verras.

évidemment, ça simplifie l'écriture, ça permet de faire des tests de valeur multiples sur une même variable sans la mentionner plusieurs fois, mais ça apporte également un outil de contrôle de flux d'instructions.

Vraiment, teste, je ne suis pas capable de trouver un code équivalent à mon switch sans goto ni test redondant, uniquement avec des ifs.
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846 > Sugel Messages postés 4076 Date d'inscription   Statut Membre Dernière intervention  
 
Sans goto, c'est possible mais avec des tests redondants. C'est pour ça que je dis que ça simplifie l'écriture (dans le sens pas besoin de faire de répéter les conditions).

Effectivement, je suis allé un poil trop vite. Ma troisième condition était fausse. Ma correction :
int val = random();
printf("the value of val is : %d", val);

if (val == 0)
  printf("val should be 0: %d\n", val);
else if (val == 1)
  printf("val should be 1 then fallback to default: %d\n", val);
if (val != 0) 
  printf("default case !");
0
Sugel Messages postés 4076 Date d'inscription   Statut Membre Dernière intervention   727
 
Vu que on n'a pas vraiment répondu à ta question subsidiaire:
il n'existe pas de notion de sous-programme en C, hormis les fonctions.

Les switch ne sont pas des fonctions, mais des structures logiques, au même qu'un if, un while ou un for:
ils sont directement exécutés à l'endroit où il est placé.

C'est un peu comme si tu demandais si
return if (a==2) 3
est valide.
0