switch
Instrução (C)
As instruções switch
e case
ajudam a controlar operações complexas condicionais e de ramificação. A instrução switch
transfere o controle para uma instrução dentro do corpo.
Sintaxe
selection-statement
:
switch (
expression
)
statement
labeled-statement
:
case
constant-expression
:
statement
default
:
statement
Comentários
Uma instrução switch
faz com que o controle seja transferido para um labeled-statement
no corpo da instrução, dependendo do valor de expression
.
Os valores de expression
e cada constant-expression
precisa ter um tipo de dados integrais. constant-expression
precisa ter um valor integral constante inequívoca no tempo de compilação.
O controle passe para a instrução case
cujo valor constant-expression
corresponde ao valor de expression
. A instrução switch
pode incluir qualquer número de instâncias case
. No entanto, nenhum valor constant-expression
dentro da mesma instrução switch
pode ter o mesmo valor. A execução do corpo da instrução switch
começa na primeira instrução dentro ou após o labeled-statement
correspondente. A execução prossegue até o final do corpo ou até que uma instrução break
transfira o controle para fora do corpo.
O uso da instrução switch
geralmente tem essa aparência:
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
}
Você pode usar a instrução break
para encerrar o processamento de uma instrução rotulada particular na instrução switch
. Ele se ramifica até o final da instrução switch
. Sem break
, o programa passa para a próxima instrução rotulada, executando as instruções até break
ou até que o final da instrução seja atingido. Essa continuação pode ser desejável em algumas situações.
A instrução default
é executada se nenhum valor case
constant-expression
for igual ao valor de expression
. Se não houver instrução default
e nenhuma correspondência case
for encontrada, nenhuma instrução no corpo switch
será executada. Pode haver, no máximo, uma instrução default
. A instrução default
não precisa vir no final. Pode aparecer em qualquer lugar no corpo da instrução switch
. Uma etiqueta case
ou default
pode ser exibida apenas dentro de uma instrução switch
.
O tipo de switch
expression
e case
constant-expression
deve ser integral. O valor de cada case
constant-expression
deve ser único no corpo da expressão.
Os rótulos case
casedefault
do corpo da instrução switch
são significativos apenas no teste inicial que determina onde a execução começa no corpo da instrução. Instruções switch
podem ser aninhadas. Todas as variáveis estáticas são inicializadas antes da execução em qualquer switch
instrução.
Observação
As declarações podem aparecer no início da instrução composta que forma o corpo de switch
, mas as inicializações incluídas nas declarações não serão executadas. A instrução switch
transfere o controle diretamente para uma instrução executável dentro do corpo, ignorando as linhas que contêm inicializações.
Os exemplos a seguir ilustram as instruções switch
:
switch( c )
{
case 'A':
capital_a++;
case 'a':
letter_a++;
default :
total++;
}
Neste exemplo, as três instruções do corpo de switch
são executadas se c
for igual a 'A'
, contanto que uma instrução break
apareça antes do case
seguinte. O controle de execução é transferido para a primeira instrução (capital_a++;
) e continua em ordem pelo restante do corpo. Se c
é igual a 'a'
, letter_a
e total
são incrementados. Só total
é incrementado quando c
não é igual 'A'
ou 'a'
.
switch( i )
{
case -1:
n++;
break;
case 0 :
z++;
break;
case 1 :
p++;
break;
}
Neste exemplo, uma instrução break
segue cada instrução do corpo de switch
. A instrução break
força uma saída do corpo da instrução depois que uma instrução é executada. Se i
for igual a -1, apenas n
será incrementado. A instrução break
que segue a instrução n++;
faz com que o controle de execução seja passado para fora do corpo da instrução, ignorando as instruções restantes. Da mesma forma, se i
é igual a 0, somente z
será incrementado; se i
é igual a 1, somente p
será incrementado. A instrução de break
final não é estritamente necessária, pois o controle passa para fora do corpo no final da instrução composta. Ela é incluída para consistência.
Uma única instrução pode portar vários rótulos de case
, conforme mostrado no exemplo a seguir:
switch( c )
{
case 'a' :
case 'b' :
case 'c' :
case 'd' :
case 'e' :
case 'f' : convert_hex(c);
}
Neste exemplo, se constant-expression
for igual a qualquer letra entre 'a'
e 'f'
, a função convert_hex
será chamada.
Específico da Microsoft
O Microsoft C não limita o número de valores case
em uma instrução switch
. O número é limitado somente pela memória disponível. O ANSI C requer que pelo menos 257 rótulos case
sejam permitidos em uma instrução switch
.
O default do Microsoft C é que as extensões da Microsoft sejam habilitadas. Use a opção de compilador /Za para desativar essas extensões.