switch
instruction (C++)
Autorise la sélection parmi plusieurs sections de code, selon la valeur d'une expression intégrale.
Syntaxe
selection-statement
:
switch
(
init-statement
optC++17condition
)
statement
init-statement
:
expression-statement
simple-declaration
condition
:
expression
attribute-specifier-seq
optdecl-specifier-seq
declarator
brace-or-equal-initializer
labeled-statement
:
case
constant-expression
:
statement
default
:
statement
Notes
Une instruction switch
entraîne le transfert du contrôle à une labeled-statement
dans son corps d’instruction, en fonction de la valeur de condition
.
Le condition
doit avoir un type intégral, ou être un type de classe qui a une conversion non ambiguë en type intégral. La promotion intégrale a lieu comme décrit dans les conversions Standard.
Le corps de l’instruction switch
se compose d’une série d’étiquettes case
et d’une optétiquette ionale default
. Il labeled-statement
s’agit de l’une de ces étiquettes et des instructions qui suivent. Les instructions étiquetées ne sont pas des exigences syntaxiques, mais l’instruction switch
est sans signification sans eux. Aucune valeur constant-expression
dans les case
instructions ne peut être évaluée à la même valeur. L’étiquette default
ne peut apparaître qu’une seule fois. L’instruction default
est souvent placée à la fin, mais elle peut apparaître n’importe où dans le corps de l’instruction switch
. Une étiquette case
ou default
ne peut apparaître qu’à l’intérieur d’une instruction switch
.
L’étiquette constant-expression
de chaque case
étiquette est convertie en valeur constante qui est le même type que condition
. Ensuite, elle est comparée à condition
l’égalité. Le contrôle passe à la première instruction après la case
constant-expression
valeur qui correspond à la valeur de condition
. Le comportement résultant est indiqué dans le tableau suivant.
switch
comportement d’instruction
Condition | Action |
---|---|
La valeur convertie correspond à celle de l'expression de contrôle promue. | Le contrôle est transféré à l'instruction qui suit cette étiquette. |
Aucune des constantes ne correspond aux constantes dans les case étiquettes ; une default étiquette est présente. |
Le contrôle est transféré vers l’étiquette default . |
Aucune des constantes ne correspond aux constantes dans les case étiquettes ; aucune étiquette n’est default présente. |
Le contrôle est transféré à l’instruction après l’instruction switch . |
Si une expression correspondante est trouvée, l’exécution peut continuer via des étiquettes ou default
ultérieurescase
. L’instruction break
est utilisée pour arrêter l’exécution et transférer le contrôle vers l’instruction après l’instruction switch
. break
Sans instruction, chaque instruction de l’étiquette correspondante case
à la fin du switch
, y compris le default
, est exécutée. Par exemple :
// switch_statement1.cpp
#include <stdio.h>
int main() {
const char *buffer = "Any character stream";
int uppercase_A, lowercase_a, other;
char c;
uppercase_A = lowercase_a = other = 0;
while ( c = *buffer++ ) // Walks buffer until NULL
{
switch ( c )
{
case 'A':
uppercase_A++;
break;
case 'a':
lowercase_a++;
break;
default:
other++;
}
}
printf_s( "\nUppercase A: %d\nLowercase a: %d\nTotal: %d\n",
uppercase_A, lowercase_a, (uppercase_A + lowercase_a + other) );
}
Dans l’exemple ci-dessus, uppercase_A
est incrémenté s’il c
s’agit d’un hautcase'A'
. L’instruction break
après uppercase_A++
l’exécution du corps de l’instruction et du switch
contrôle passe à la while
boucle. Sans l’instruction, l’exécution break
« passe » à l’instruction étiquetée suivante, de sorte qu’elle lowercase_a
soit other
également incrémentée. Un objectif similaire est servi par l’instruction break
pour case 'a'
. Si c
elle est inférieurecase'a'
, lowercase_a
est incrémentée et l’instruction break
met fin au corps de l’instruction switch
. Si c
ce n’est pas un 'a'
ou 'A'
, l’instruction default
est exécutée.
Visual Studio 2017 et versions ultérieures (disponible en /std:c++17
mode et versions ultérieures) : l’attribut [[fallthrough]]
est spécifié dans la norme C++17. Vous pouvez l’utiliser dans une switch
instruction. Il s’agit d’un indicateur pour le compilateur, ou toute personne qui lit le code, ce comportement de basculement est intentionnel. Actuellement, le compilateur Microsoft C++ n’avertit pas le comportement de secours. Cet attribut n’a donc aucun effet sur le comportement du compilateur. Dans l’exemple, l’attribut est appliqué à une instruction vide dans l’instruction étiquetée non déterminée. En d’autres termes, le point-virgule est nécessaire.
int main()
{
int n = 5;
switch (n)
{
case 1:
a();
break;
case 2:
b();
d();
[[fallthrough]]; // I meant to do this!
case 3:
c();
break;
default:
d();
break;
}
return 0;
}
Visual Studio 2017 version 15.3 et ultérieure (disponible en /std:c++17
mode et versions ultérieures) : une switch
instruction peut avoir une init-statement
clause, qui se termine par un point-virgule. Il introduit et initialise une variable dont l’étendue est limitée au bloc de l’instruction switch
:
switch (Gadget gadget(args); auto s = gadget.get_status())
{
case status::good:
gadget.zip();
break;
case status::bad:
throw BadGadget();
};
Un bloc interne d’une switch
instruction peut contenir des définitions avec des initialiseurs tant qu’ils sont accessibles, autrement dit, pas ignorés par tous les chemins d’exécution possibles. Les noms présentés à l'aide de ces déclarations ont une portée locale. Par exemple :
// switch_statement2.cpp
// C2360 expected
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
switch( tolower( *argv[1] ) )
{
// Error. Unreachable declaration.
char szChEntered[] = "Character entered was: ";
case 'a' :
{
// Declaration of szChEntered OK. Local scope.
char szChEntered[] = "Character entered was: ";
cout << szChEntered << "a\n";
}
break;
case 'b' :
// Value of szChEntered undefined.
cout << szChEntered << "b\n";
break;
default:
// Value of szChEntered undefined.
cout << szChEntered << "neither a nor b\n";
break;
}
}
Une switch
instruction peut être imbriquée. Lorsqu’elles sont imbriquées, les case
étiquettes ou default
les associent à l’instruction la plus switch
proche qui les entoure.
Comportement spécifique à Microsoft
Microsoft C++ ne limite pas le nombre de case
valeurs dans une switch
instruction. Le nombre est limité uniquement par la mémoire disponible.
Voir aussi
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour