web-dev-qa-db-fra.com

Pourquoi l'instruction switch et pas if-else?

Je me pose la question depuis un certain temps maintenant. Je ne suis de loin pas un programmeur hardcore, principalement de petits scripts Python et j'ai écrit quelques simulations de dynamique moléculaire. Pour la vraie question: quel est l'intérêt de la instruction switch? Pourquoi ne pouvez-vous pas simplement utiliser le instruction if-else?

Merci pour votre réponse et si cela a déjà été demandé, veuillez me diriger vers le lien.

[~ # ~] modifier [~ # ~]

S.Lott a souligné que cela peut être un double des questions If/Else vs. Switch . Si vous souhaitez fermer, faites-le. Je vais le laisser ouvert pour une discussion plus approfondie.

59
Nope

Une construction de commutateur est plus facilement traduite en une table saut (ou branche) . Cela peut rendre les instructions de commutation beaucoup plus efficaces que if-else lorsque les étiquettes de cas sont rapprochées. L'idée est de placer un tas d'instructions de saut séquentiellement en mémoire, puis d'ajouter la valeur au compteur de programme. Cela remplace une séquence d'instructions de comparaison par une opération d'ajout.

Vous trouverez ci-dessous quelques exemples extrêmement simples d'assemblage de pseudo-assemblage. Tout d'abord, la version if-else:

    // C version
    if (1 == value)
        function1();
    else if (2 == value)
        function2();
    else if (3 == value)
        function3();

    // Assembly version
    compare value, 1
    jump if zero label1
    compare value, 2
    jump if zero label2
    compare value, 3
    jump if zero label3
label1:
    call function1
label2:
    call function2
label3:
    call function3

Vient ensuite la version du commutateur:

    // C version
    switch (value) {
    case 1: function1(); break;
    case 2: function2(); break;
    case 3: function3(); break;
    }

    // Assembly version
    add program_counter, value
    call function1
    call function2
    call function3

Vous pouvez voir que le code d'assemblage résultant est beaucoup plus compact. Notez que la valeur devrait être transformée d'une manière ou d'une autre pour gérer d'autres valeurs que 1, 2 et 3. Cependant, cela devrait illustrer le concept.

87
Judge Maygarden

Le commutateur peut être optimisé par compilation r - vous obtiendrez un code plus rapide.
Je trouve également qu'il est plus élégant lorsqu'il s'agit de types énumérables.

Pour résumer switch l'instruction vous donne les performances + l'élégance du code :)

Voici quelques liens utiles:

22
aku

Pour l'expressivité, l'instruction switch/case vous permet de regrouper plusieurs cas, par exemple:

case 1,2,3: do(this); break;
case 4,5,6: do(that); break;

Pour les performances, les compilateurs peuvent parfois optimiser les instructions de commutation dans des tables de saut.

6
jdigital

J'ignore ce type d'optimisation de bas niveau comme généralement sans importance, et probablement différent d'un compilateur à l'autre.

Je dirais que la principale différence est la lisibilité. if/else est très flexible, mais quand vous voyez un commutateur, vous savez tout de suite que tous les tests sont contre la même expression.

6
Darron

Outre les autres lisibilité et optimisation du code mentionnées dans .NET, vous avez également la possibilité d'activer les énumérations, etc.

enum Color { Red, Green, Blue }; 

Color c = Color.Red;

switch (c) // Switch on the enum

{

// no casting and no need to understand what int value it is

case Color.Red:    break;
case Color.Green:  break;
case Color.Blue:   break;

}
3
Justin King

La possibilité de passer à travers plusieurs cas (en laissant intentionnellement de côté la déclaration de rupture) peut être utile, et comme quelques personnes l'ont déjà dit, c'est aussi plus rapide. Peut-être que la considération la plus importante et la moins importante est que cela rend le code plus joli que si/sinon. :)

2
Marc Charbonneau

Le commutateur peut être optimisé "Mieux" par certains compilateurs. Il y a des pièges à utiliser l'instruction switch dans certaines langues. En Java, le commutateur ne peut pas gérer les chaînes et dans VB2005, l'instruction switch ne fonctionnera pas avec les boutons radio.
Le commutateur peut être plus rapide et plus facile à lire, If-Then est plus générique et fonctionnera dans plus d'endroits.

1
WolfmanDragon