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
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
A voir également:
- Règle switch case
- Regle telephone - Guide
- Logiciel switch - Télécharger - Conversion & Extraction
- Aller à la ligne dans une case excel - Guide
- Gmail regle de classement - Guide
- Samsung switch pc - Télécharger - Divers Bureautique
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
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;.
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;.
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
Modifié par Sugel le 4/05/2016 à 11:09
pour rendre le truc un peu plus clair:
un switch case comme ça:
est vaguement équivalent à ça:
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 !
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 !
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
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 :
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 !");
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
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.
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.
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
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 :
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.
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.
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
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.
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.
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
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 :
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 !");
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
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
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) 3est valide.
2 mai 2016 à 19:10
2 mai 2016 à 19:12
4 mai 2016 à 10:05