Instrução while

A instrução while é muito parecida com a instrução if, porém a instrução seguinte será executada repetidamente até que a condição seja falsa. Nas instruções de iteração, como while, a instrução após a condição é chamada loop body.

Um exemplo de uso do while é um contador. Utilizando um loop body que exibe o valor de uma variável e a incrementa, podemos gradualmente incrementar essa variável até que a condição seja falsa. Você consegue imaginar a saída produzida pelo código abaixo?

int contador = 0;

//      ⬐ Enquanto contador for menor ou igual a 10
while (contador <= 10)
{ // ← Início do loop body

    // Exibir o valor do contador
    printf("%d ", contador);

    // Incrementar o contador em 1
    contador = contador + 1;

} // ← Fim do loop body

puts("e terminamos!");

Saída: 0 1 2 3 4 5 6 7 8 9 10 e terminamos!

Enquanto esse tipo de laço tem seus usos, eles são mais poderosos quando utilizados com arrays. Utilizando um laço que percorre um array, podemos realizar operações com todos seus elementos um por um. Que tal reduzir um array à soma de todos valores nele contidos?

int array[5] = {10, 5, 3, 5, 2};
int soma = 0; // Armazenamos a soma aqui

// Utilizamos esse "índice" para acessar cada elemento
int i = 0;

while (i < 5)
{
    // Adicionamos o valor do elemento à soma
    soma = soma + array[i];

    // Incrementamos o índice
    i = i + 1;
}

Após a execução do código acima, a variável soma terá o valor 25. A instrução for costuma ser mais apropriada para percorrer arrays. Ela será introduzida em breve.

Outra utilidade do while é fazer menus com opções. Vejamos um exemplo:

int opcao = 1;

while (opcao != 0)
{
    // Exibir as opções
    printf("0 - Sair\n"
           "1 - Exibir \"Olá\"\n"
           "2 - Exibir \"Mundo!\"\n"
           "Opção: ");

    // Ler a opção escolhida
    scanf("%d", &opcao);

    // Exibir a palavra escolhida
    if (opcao == 1)
        puts("Olá");
    else if (opcao == 2)
        puts("Mundo!");
    else
        puts("Opção inválida!");
}

Assim que a opção for 0, o laço será interrompido. Enquanto isso não acontecer, "Olá" ou "Mundo!" serão exibidos conforme as escolhas.

Você pode ter percebido que na primeira execução, verificar a condição é inútil pois opcao possui inicialmente o valor 1. Para ignorar a condição na primeira execução, basta utilizar a palavra-chave do antes da instrução composta e mover o while com sua condição para após a instrução. Veja a versão modificada para isso ficar mais claro:

int opcao = 1;

do // Substituímos o while (...) por do
{
    printf("0 - Sair\n"
           "1 - Exibir \"Olá\"\n"
           "2 - Exibir \"Mundo!\"\n"
           "Opção: ");

    scanf("%d", &opcao);

    if (opcao == 1)
        puts("Olá");
    else if (opcao == 2)
        puts("Mundo!");
    else
        puts("Opção inválida!");
} while (opcao != 0); // O while (...) fica após a instrução

Assim, não fazemos mais a verificação desnecessária do valor de opcao inicialmente.

É possível interromper um laço prematuramente usando a palavra-chave break, que para a execução do laço assim que executada. Podemos fazer um laço com uma tautologia (condição sempre verdadeira) e utilizar break para pará-lo:

while (true) // Lembre-se de incluir <stdbool.h>
{
    printf("0 - Sair\n"
           "1 - Exibir \"Olá\"\n"
           "2 - Exibir \"Mundo!\"\n"
           "Opção: ");

    int opcao;
    scanf("%d", &opcao);

    // Parar o laço caso a opção seja 0
    if (opcao == 0)
        break;

    if (opcao == 1)
        puts("Olá");
    else if (opcao == 2)
        puts("Mundo!");
    else
        puts("Opção inválida!");
}

Repare que como a condição não utiliza mais a variável opcao, ela pôde ser movida para dentro da instrução composta, pois apenas lá ela é utilizada. Mesmo com as mudanças, o código ainda aparenta se comportar da mesma forma.