114 votes

Déclarer des variables dans une instruction switch

J’ai vu quelques réponses à cette question et je comprends pas-vous ne peut pas déclarer et affecter des variables à l’intérieur d’un commutateur. Mais je me demande si ce qui suit est correct à lancer une « erreur : attendu expression avant « int »

Pourquoi mettre un NSLog saisi entraînerait aucune erreur ?

140voto

Quinn Taylor Points 29688

En fait vous pouvez déclarer des variables à l'intérieur d'un commutateur si vous le faire en fonction de la syntaxe de la langue. Vous obtenez une erreur car "case 0:" est un label, et en C, il est illégal d'avoir une déclaration comme la première déclaration après l'étiquette de noter que le compilateur s'attend à une expression, comme un appel de méthode, attribution normale, etc. (Bizarre qu'il soit, c'est la règle.)

Lorsque vous mettez le NSLog() tout d'abord, vous éviter cette limitation. Vous pouvez inclure le contenu d'un cas dans accolades { } pour présenter une étude sur la portée de bloc, ou vous pouvez déplacer la déclaration de la variable à l'extérieur de l'interrupteur. Que vous choisissez est une question de préférence personnelle. Juste être conscient qu'une variable déclarée dans accolades { } n'est valable que dans cette étendue, de sorte que n'importe quel autre code qui l'utilise doit également apparaître à l'intérieur de ces accolades.


Edit:

Par ailleurs, cette bizarrerie n'est pas aussi rare qu'on pourrait le croire. En C et en Java, il est également illégal d'utiliser une déclaration de variable locale comme seule instruction (qui signifie "pas entouré par des accolades) dans une pour, tandis que, ou de faire une boucle, ou même dans si et d'autre des clauses. (En fait, c'est couvert dans le jeu de puzzle n ° 55 de Java"casse-têtes", que je recommande fortement.) Je pense que généralement nous n'écris pas ces erreurs pour commencer parce qu'il fait peu de sens pour déclarer une variable comme la seule instruction dans de tels contextes. Avec le commutateur / cas des constructions, que certaines personnes omettre les accolades depuis le saut de déclaration, la déclaration critique pour le contrôle de flux.

Pour voir le compilateur jeter correspond, copiez cette horrible, inutile extrait de code dans votre (Objectif)du code 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. :-)

46voto

newacct Points 42530

J’ai rencontré ce problème avant, et la conclusion fut que vous venez de mettre le code dans un bloc.

3voto

Joel Points 4723

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 des variables à un code de bloc (ou avoir des instructions case avec des blocs de code et autres sans).

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