Instruction switch
(C)
Les instructions switch
et case
aident à contrôler les opérations conditionnelles et de création de branche complexes. L'instruction switch
transfère le contrôle à une instruction dans son corps.
Syntaxe
selection-statement
:
switch (
expression
)
statement
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 expression
.
Les valeurs de expression
et chaque constant-expression
doivent avoir un type intégral. Une constant-expression
doit avoir une valeur intégrale constante non ambiguë au moment de la compilation.
Le contrôle passe à l’instruction case
dont la valeur constant-expression
correspond à la valeur de expression
. L’instruction switch
peut inclure un nombre quelconque d’instances case
. Toutefois, deux valeurs constant-expression
ne peuvent pas être identiques dans la même instruction switch
. L’exécution du corps de l’instruction switch
commence à la première instruction dans ou après la labeled-statement
correspondante. L’exécution se poursuit jusqu’à la fin du corps, ou jusqu’à ce qu’une instruction break
transfère le contrôle hors du corps.
L'utilisation de l'instruction switch
ressemble généralement à ceci :
switch ( expression )
{
// declarations
// . . .
case constant_expression:
// statements executed if the expression equals the
// value of this constant_expression
break;
default:
// statements executed if expression does not equal
// any case constant_expression
}
Vous pouvez utiliser l’instruction break
pour mettre fin au traitement d’une instruction étiquetée particulière à l’intérieur de l’instruction switch
. Elle se branche à la fin de l’instruction switch
. À défaut de break
, le programme continue jusqu’à l’instruction étiquetée suivante, exécutant les instructions jusqu’à rencontrer un break
ou atteindre la fin de l’instruction. Cette continuation peut être souhaitable dans certaines situations.
L’instruction default
est exécutée si aucune valeur case
constant-expression
n’est égale à la valeur de expression
. S’il n’y a pas d’instruction default
et qu’aucune correspondance de case
n’est trouvée, aucune des instructions du corps switch
n’est exécutée. Il peut y avoir au plus une instruction default
. L’instruction default
ne dois pas nécessairement venir à la fin. 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
.
Le type de switch
expression
et case
constant-expression
doit être intégral. La valeur de chaque case
constant-expression
doit être unique dans le corps de l’instruction.
Les étiquettes case
et default
du corps de l’instruction switch
sont significatives uniquement lors du test initial qui détermine où commence l’exécution dans le corps de l’instruction. Les instructions switch
peuvent être imbriquées. Toutes les variables statiques sont initialisées avant l'exécution dans les instructions switch
.
Notes
Des déclarations peuvent apparaître au début de l'instruction composée formant le corps de switch
, mais les initialisations incluses dans les déclarations ne sont pas exécutées. L'instruction switch
transfère le contrôle directement à une instruction exécutable dans le corps, en ignorant les lignes qui contiennent des initialisations.
L'exemples suivant illustre des instructions switch
:
switch( c )
{
case 'A':
capital_a++;
case 'a':
letter_a++;
default :
total++;
}
Les trois instructions du corps de switch
dans cet exemple sont exécutées si c
est égal à 'A'
, car aucune instruction break
n’apparaît avant l’étiquette case
suivante. Le contrôle d'exécution est transféré à la première instruction (capital_a++;
) et continue dans l'ordre à travers le reste du corps. Si c
est égal à 'a'
, letter_a
et total
sont incrémentés. Seul total
est incrémenté quand c
n’est pas égal à 'A'
ou 'a'
.
switch( i )
{
case -1:
n++;
break;
case 0 :
z++;
break;
case 1 :
p++;
break;
}
Dans cet exemple, une instruction break
suit chaque instruction du corps de switch
. L’instruction break
force une sortie du corps de l’instruction après l’exécution d’une instruction. Si i
est égal à -1, seul n
est incrémenté. Le break
suivant l’instruction n++;
a pour effet de passer le contrôle d’exécution hors du corps de l’instruction, et d’ignorer les instructions restantes. De même, si i
est égal à 0, seul z
est incrémenté ; si i
est égal à 1, seul p
est incrémenté. L’instruction break
finale n’est pas strictement nécessaire, car le contrôle passe hors du corps à la fin de l’instruction composée. Elle est incluse pour la cohérence.
Une même instruction peut porter plusieurs étiquettes case
, comme illustré dans l’exemple suivant :
switch( c )
{
case 'a' :
case 'b' :
case 'c' :
case 'd' :
case 'e' :
case 'f' : convert_hex(c);
}
Dans cet exemple, si constant-expression
est égale à une lettre entre 'a'
et 'f'
, la fonction convert_hex
est appelée.
Spécifique à Microsoft
Microsoft C ne limite pas le nombre de valeurs case
dans une instruction switch
. Le nombre est limité uniquement par la mémoire disponible. C ANSI requiert qu’au moins 257 étiquettes case
soient autorisées dans une instruction switch
.
Le paramétrage default pour Microsoft C, est que les extensions Microsoft sont activées. Utilisez l’option du compilateur /Za pour désactiver ces extensions.