27 votes

Ce n'opérateur virgule signifie dans une instruction switch?

J'ai reçu une question et a demandé de donner la sortie.

int main(void){  
    int x = 2;  
    switch(x){  
        case 1,2,1: printf("Case 1 is executed");  
            break;  
        case 2,3,1: printf("Case 2 is executed");  
            break;  
        default : printf("Default case us executed");  
    }  
    return 0;  
}

Le code ci-dessus donne le résultat que "le Cas 1 est exécuté" en Turbo C, Mais sur codeblocks et compiler en ligne, il donne une erreur de compilation.

Laquelle est la bonne? Est-ce une erreur du compilateur ou pas? Et si non, pourquoi le code de s'exécuter uniquement sur Turbo C?

38voto

Mike Seymour Points 130519

est-ce une erreur du compilateur ou pas.

Le code n'est pas valide dans les deux langues: l' case expression doit être une expression constante, et une expression constante ne peut pas contenir un opérateur virgule. (En C, c'est ce que dit explicitement; en C++, vous devez détricote la grammaire de trouver une constante de l'expression doit être un conditionnel expression, qui ne peut pas contenir une virgule).

Même si vous avez été autorisé à utiliser l'opérateur virgule ici, l' switch déclaration serait encore invalide depuis les deux cas, les deux ont la même valeur, 1.

Et si non, pourquoi le code de s'exécuter uniquement sur turbo C.

Parce que les deux langues ont beaucoup changé depuis la préhistoire de compilateur dernière mise à jour. Ne l'utilisez pas si vous voulez apprendre des variantes de C ou de C++ à partir de ce siècle.

10voto

ryyker Points 3662

Ce n'opérateur virgule signifie dans une instruction switch?
Cela signifie que vous avez un vieux compilateur

Edit post (pour montrer case range exemple)

Les deux premiers exemples (y compris votre code d'origine ) présentent incorrect commutateur syntaxe de l'instruction (avec des explications). Le troisième exemple de code montre comment l'empilement de cas, les étiquettes se fait correctement:

Dans votre code, le compilateur doit avoir marqué le premier point, case 1,<-- ici

#include <ansi_c.h>
int main(void){  
    int x = 2;  
    switch(x)
    {  
        case 1,2,1: printf("Case 1 is executed");  
        break;  //error flagged at first comma, and all comma after in case
        case 2,3,1: printf("Case 2 is executed");  
        break;  
        default : printf("Default case us executed");  
    }  
    return 0;  
}  

Et, même modifiés comme cela, vous devez également obtenir un double de l'étiquette d'erreur:

#include <ansi_c.h>
int main(void){  
    int x = 2;  
    switch(x)
    {  
        case 1:
        case 2:
        case 1: printf("Case 1 is executed"); //duplicate label 1 error. (and others below) 
            break;  
        case 2:
        case 3:
        case 1: printf("Case 2 is executed");  
            break;

        default : printf("Default case us executed");  
    }
    return 0;  
}

Cet exemple est parfaitement légal (C99, C11) et utile: c'est à dire, il n'y a pas des étiquettes en double, et la syntaxe est conforme avec commutateur correct de l'utilisation par l'empilement unique étiquettes pour gérer des conditions où l' case 1: OR case 2: OR case 3: devraient être traitées de la même manière, (dans le même bloc). Et bien sûr, la même chose est vraie pour le cas 4, 5 et 6.

#include <ansi_c.h>
int main(void){  
    int x = 2;  
    switch(x)
    {  
        case 1:
        case 2:
        case 3: printf("Case 1,2 or 3 is executed"); //duplicate label 1 error. (and others below) 
            break;  
        case 4:
        case 5:
        case 6: printf("Case 4,5 or 6 is executed");  
            break;
    }
    getchar();
    return 0;  
}

Ce dernier exemple est inclus juste pour être complet. Il illustre l' case range expression. Bien que gagner de l'intérêt chez les programmeurs C, c'est pas encore partie de C99 ou C11, mais plutôt d'une extension de Soleil (une variante d'unix) et le compilateur GNU C (et coll.?):

...
    switch(x)
    {  
            case 'a' ... 'z':  //note: spaces between all characters ('a') and ellipses are required
                    printf("lowercase alpha char detected");
                    break;
            case 'A' ... 'B':
                    printf("uppercase alpha char detected");
                    break;

            default: printf("Default case is executed");  
    }
...

La raison de l'ambiguïté des résultats que vous voyez à partir d'un compilateur à l'autre, c'est que le Turbo C est vraiment vraiment vieux. La version que vous utilisez peut pas analyser et de compiler la même façon un nouveau compilateur. :)

Pour un (bon marché) de remplacement, je vous suggère d'essayer de minGW. Je l'utilise avec Code::Blocks, il est très bien intégrée à l'IDE. Il est plus courant, et entretenus de manière assez bien pour un compilateur libre. (peut-être mieux que certains compilateurs commerciaux)

1voto

Kumareshan Points 613

Turbo C utilise l'opérateur virgule sur l'interrupteur cas et prend la dernière valeur, par exemple le cas 1, 2, 3: seront compilés en tant que cas 3: cas 2, 3, 1 dans le cas 1: donc Turbo C ne vous donnera pas une erreur. Alors que d'autres compilateurs ne vous permettra pas de cas 1, 2, 3: type de déclaration elle-même.

Mais dans votre cas, même Turbo c donnera l'erreur, car les cas énoncés sont quelque chose comme ceci les cas 1, 2, 1: 3, 2, 1: qui sera respecté dans le cas 1: et cas 1: donc comme par commutateur cas des règles, vous pouvez avoir seulement 1 cas avec une valeur et vous ne pouvez pas répéter le cas

Je préfère utiliser le compilateur gcc plutôt Turbo C

0voto

haccks Points 33022

est-ce une erreur du compilateur ou pas.

Il va provoquer une erreur de compilation (je ne sais pas à propos de TURBO C++ , mais dans les compilateurs modernes).
Ce n'est pas la voie de l'instruction switch fonctionne (syntaxe non valide en c/c++). Vous ne pouvez pas réutiliser un case valeur en switch compte de résultat (voir le lien donné par chris) de La façon dont vous pouvez le faire;

 switch(x){
            case 1: case 2: case 3: printf("Case 1 is executed");
            break;
            default : printf("Default case us execyted"); 
          }

0voto

lolando Points 1436

Vous ne pouvez pas utiliser deux fois le même " cas " en valeur
Ce n'est pas correct: case 1: case 2: case 1: printf("Case 1 is executed");
Essayé de compiler sur VS2010 => (erreur C2196: le cas de la valeur " 1 " est déjà utilisé)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X