Question

    

Cette question a déjà une réponse ici:

         

J'ai lu quelques réponses à ce problème et je comprends. Vous ne pouvez pas déclarer et affecter des variables dans un commutateur . Mais je me demande si ce qui suit est correct à jeter une erreur en disant

  

erreur: expression attendue avant 'int'

Code:

switch (i) {
    case 0:
        int j = 1;
        break;
}

Pourquoi passer un appel à NSLog () avant qu'il n'y ait plus d'erreur?

switch (i) {
    case 0:
        NSLog(@"wtf");
        int j = 1;
        break;
}
Était-ce utile?

La solution

En réalité, vous pouvez déclarer des variables dans un commutateur si vous le faites conformément à la syntaxe du langage. Vous obtenez une erreur car "" case 0: ". est une étiquette et, en C, il est illégal d'avoir une déclaration en tant que première instruction après une étiquette. Notez que le compilateur attend une expression , telle qu'un appel de méthode, normal. affectation, etc. (Aussi bizarre que cela puisse être, c'est la règle.)

Lorsque vous mettez d'abord NSLog (), vous évitez cette limitation. Vous pouvez inclure le contenu d'une observation entre accolades {} pour introduire un bloc de définition de domaine ou déplacer la déclaration de variable en dehors du commutateur. Ce que vous choisissez est une question de préférence personnelle. Sachez simplement qu'une variable déclarée entre accolades {} n'est valide que dans cette étendue; tout autre code qui l'utilise doit donc également figurer entre ces accolades.

Modifier:

Au fait, cette bizarrerie n’est pas aussi rare que vous pourriez le penser. En C et en Java, il est également illégal d'utiliser une déclaration de variable locale comme instruction unique (ce qui signifie "non entouré d'accolades) dans un pour , en ou ne boucle, ou même dans les clauses si et autre . (En fait, cela est couvert dans le casse-tête n ° 55 de "Java Puzzlers & ", ce que je recommande vivement.) Je pense que nous n'écrivons généralement pas de telles erreurs au début, car il est peu logique de déclarer une variable comme la seule déclaration dans de tels contextes. Avec les constructions switch / case , cependant, certaines personnes omettent les accolades, car l'instruction break est l'instruction essentielle pour le contrôle des flux.

Pour voir les ajustements du compilateur, copiez ce fragment de code horrible et inutile dans votre code (objectif) C:

if (1)
    int i;
else
    int i;
for (int answer = 1; answer <= 42; answer ++)
    int i;
while (1)
    int i;
do
    int i;
while (1);

Encore une autre raison de toujours utiliser des {} accolades pour délimiter le corps de telles constructions. : -)

Autres conseils

J'ai déjà rencontré ce problème auparavant et la conclusion a été que vous venez de placer le code dans un bloc.

switch (i) {
case 0:
    {
        int j = 1;
        break;
    }
}

Une autre solution simple que j'utilise consiste à ajouter une expression vide (point-virgule) avant la déclaration. Cela évite de limiter la portée de la variable à un bloc de code (ou d'avoir des instructions case avec des blocs de code et d'autres sans).

switch (i) {
    case 0:;
        int j = 1;
        break;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top