Compartilhar via


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 casecasedefault 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.

Confira também

switch Instrução (C++)