Règle switch case

Fermé
pyfpafpouf Messages postés 6 Date d'inscription mercredi 30 mars 2016 Statut Membre Dernière intervention 2 mai 2016 - 2 mai 2016 à 17:04
Sugel Messages postés 4076 Date d'inscription jeudi 18 août 2011 Statut Membre Dernière intervention 19 juin 2017 - 21 mai 2016 à 19:57
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 dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
2 mai 2016 à 17:51
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 mercredi 30 mars 2016 Statut Membre Dernière intervention 2 mai 2016
2 mai 2016 à 19:10
Ok merci beaucoup !
0
pyfpafpouf Messages postés 6 Date d'inscription mercredi 30 mars 2016 Statut Membre Dernière intervention 2 mai 2016
2 mai 2016 à 19:12
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 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
4 mai 2016 à 10:05
@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 jeudi 18 août 2011 Statut Membre Dernière intervention 19 juin 2017 725
Modifié par Sugel le 4/05/2016 à 11:09
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
4 mai 2016 à 23:43
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 jeudi 18 août 2011 Statut Membre Dernière intervention 19 juin 2017 725
5 mai 2016 à 01:17
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
5 mai 2016 à 11:02
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 jeudi 18 août 2011 Statut Membre Dernière intervention 19 juin 2017 725 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
Modifié par Sugel le 5/05/2016 à 23:33
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842 > Sugel Messages postés 4076 Date d'inscription jeudi 18 août 2011 Statut Membre Dernière intervention 19 juin 2017
Modifié par fiddy le 6/05/2016 à 17:24
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 jeudi 18 août 2011 Statut Membre Dernière intervention 19 juin 2017 725
9 mai 2016 à 21:21
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