web-dev-qa-db-fra.com

instruction switch-case sans interruption

Selon ce livre que je lis :

Q Que se passe-t-il si j'omets une interruption dans une instruction switch-case?

A L'instruction break permet à l'exécution du programme de quitter la construction du commutateur. Sans cela, l'exécution continue d'évaluer les instructions de cas suivantes.

Supposons que si j'ai des codes ressemblant à

switch (option}{
    case 1:
    do A;
    case 2:
    do B;
    default:
    do C;
    break;
}

Est-ce à dire que si je choisis le cas 1, les A et C sont terminés. Si je choisis le cas 2, B et C sont terminés. Si je ne choisis ni l'un ni l'autre, alors seul C est fait.

si oui, que se passe-t-il si nous omettons la pause après le do C.

Je suppose que ce sont de mauvaises pratiques de programmation, mais je suis curieux de savoir ce qui se passerait pour mieux comprendre comment tout cela fonctionne. Merci

13
Lost1

La coupure agit comme une commande "GOTO", ou, ce qui pourrait être un meilleur exemple, est semblable à l'utilisation de la fonction "return" sur une fonction "void". Donc, puisque c'est la fin, cela ne fait aucune différence que ce soit là ou non. Bien que j'aime l'inclure.

4
Craig Mosey

Vous exécutez tout à partir du cas sélectionné jusqu'à ce qu'une instruction break ou switch se termine. Il se pourrait donc que seul C soit exécuté, ou B puis C, ou A et B et C, mais jamais A et C

19
Shoe
  • Si vous n'incluez pas de rupture dans aucun des cas, alors tout le cas ci-dessous sera exécuté et jusqu'à ce qu'il voit une rupture.

  • Et si vous n'incluez pas de rupture par défaut, cela n'aura aucun effet car il n'y a aucun cas en dessous de ce cas 'Par défaut'.

  • Et ne pas utiliser la pause généralement considérée comme une mauvaise pratique, mais elle peut parfois être utile en raison de sa nature de chute. Par exemple:

    option de boîtier A:

    //optionA needs to do its own thing, and also B's thing.
    //Fall-through to optionB afterwards.
    //Its behaviour is a superset of B's.
    

    option de cas B:

    // optionB needs to do its own thing
    // Its behaviour is a subset of A's.
    break;
    

    option de cas C:

    // optionC is quite independent so it does its own thing.
    break;
    
10
Khatri
switch (option}{
    case 1:
    do A;
    case 2:
    do B;
    case 2:
    do C;
    break;  
    default:
    do C;
}

si votre option est 1 il exécute tout jusqu'à ce qu'il trouve le mot-clé break ... ce qui signifie pause termine l'excution du switch -> case Sortie: A puis B puis C donc il est recommandé de faire une pause après chaque cas comme:

switch (option}{
        case 1:
        do A;
        break;
        case 2:
        do B;
        break;
        do C;
        break;        
        default:
        do D;
    }

si votre option est 1 la sortie sera: juste A ...

note: default n'a pas besoin d'un break;

7
Adham Gamal

J'ai vu dans de nombreux commentaires et réponses que c'est une mauvaise pratique d'omettre les lignes break. Personnellement, je le trouve très utile dans certains cas.

Prenons un exemple très simple. Ce n'est probablement pas le meilleur, prenez-le simplement comme illustration:
- en cas de mauvaise connexion, vous devez enregistrer la tentative qui a échoué.
- pour la troisième mauvaise tentative, vous voulez vous connecter et faire d'autres choses (alerte administrateur, blocage de compte, ...).

Comme l'action est la même pour le premier et le deuxième essai, pas besoin de break entre ces deux et de réécrire les mêmes commandes une deuxième fois.
Maintenant, la troisième fois, vous voulez faire autre chose ET aussi vous connecter. Faites d'abord les autres choses, puis laissez-le s'exécuter (pas de break) à travers l'action du journal des première et deuxième tentatives:

switch (badCount) {
    case 3: //only for 3
        alertAdmin();
        blockAccount();
    case 2: //for 2 AND 3
    case 1: //for 1 AND 2 and 3
        errorLog();
        badCount++;
}

À mon humble avis, si c'était une mauvaise pratique d'avoir un code commun pour différents cas, la structure C ne le permettrait tout simplement PAS.

3
fpierrat