Quel est l'intérêt d'utiliser {
et }
dans une case
déclaration? Normalement, quel que soit le nombre de lignes présentes dans une case
instruction, toutes les lignes sont exécutées. Est-ce juste une règle concernant les compilateurs plus anciens / plus récents ou il y a quelque chose derrière cela?
int a = 0;
switch (a) {
case 0:{
std::cout << "line1\n";
std::cout << "line2\n";
break;
}
}
et
int a = 0;
switch (a) {
case 0:
std::cout << "line1\n";
std::cout << "line2\n";
break;
}
c++
switch-statement
Mahmood
la source
la source
switch
mot - clé, et dans le deuxième exemple, les instructions incluses ne sont indentées qu'une seule fois. Notez que vous avez un désindentation maladroite de quatre espaces après lebreak;
.statement
. En C ++, vous pouvez (un composant de la catégorie syntaxiquestatement
estdeclaration statement
).Réponses:
Le
{}
désigne un nouveau bloc de portée .Prenons l'exemple très artificiel suivant:
Vous obtiendrez une erreur du compilateur car elle
x
est déjà définie dans la portée.Séparer ces derniers en leur propre sous-étendue éliminera le besoin de déclarer en
x
dehors de l'instruction switch.la source
TL; DR
La seule façon de déclarer une variable avec un initiateur ou un objet non trivial dans un cas est d'introduire une portée de bloc en utilisant
{}
ou une autre structure de contrôle qui a sa propre portée comme une boucle ou une instruction if .Détails sanglants
Nous pouvons voir que les cas ne sont que des instructions étiquetées comme les étiquettes utilisées avec une instruction goto ( cela est couvert dans le projet de norme C ++ section 6.1 Instruction étiquetée ) et nous pouvons voir dans la section
6.7
paragraphe 3 que sauter une déclaration n'est pas autorisé dans de nombreux cas , y compris ceux avec une initialisation:et donne cet exemple:
Notez qu'il y a quelques subtilités ici, vous êtes autorisé à sauter une déclaration scalaire qui n'a pas d'initialisation, par exemple:
est parfaitement valide ( exemple en direct ). Bien sûr, si vous voulez déclarer la même variable dans chaque cas, ils auront chacun besoin de leur propre portée, mais cela fonctionne de la même manière en dehors des instructions switch , donc cela ne devrait pas être une grande surprise.
En ce qui concerne la justification de ne pas autoriser le saut d'initialisation, le rapport de défaut 467, bien que couvrant un problème légèrement différent, fournit un cas raisonnable pour les variables automatiques :
Il est probablement plus intéressant de regarder le cas où vous étendez une portée dans un basculement sur plusieurs cas, les exemples les plus célèbres de ceci sont probablement l'appareil de Duff qui ressemblerait à ceci:
la source
C'est une habitude qui vous permet d'injecter des déclarations de variables avec le destructeur résultant (ou les conflits de portée) dans les
case
clauses. Une autre façon de voir les choses est qu'ils écrivent pour le langage qu'ils aimeraient avoir, où tout contrôle de flux se compose de blocs et non de séquences d'instructions.la source
Vérifiez ceci une restriction de base du compilateur et vous commencerez à vous demander ce qui se passe:
Cela vous donnera une erreur:
Bien que celui-ci ne:
la source
L'utilisation de crochets dans le commutateur indique un nouveau bloc de portée comme l'a dit Rotem.
Mais cela peut l'être aussi pour plus de clarté lorsque vous lisez. Pour savoir où le cas s'arrête car vous pourriez y avoir une rupture conditionnelle.
la source
Les raisons peuvent être:
la source