Programação

Laço while: o que é e como usar

Atualizado em

Capa do artigo Laço while: o que é e como usar
Leitura com foco

Entenda o contexto.
Leve para a prática.

Neste artigo
  1. Como funciona o laço while?
  2. Quando usar for e quando usar while?
  3. Como usar o laço while em Python, PHP e C?
  4. O que é o do-while?
  5. Aí você pergunta: e se a condição nunca ficar falsa?
  6. Quais são os erros mais comuns com o laço while?
  7. Agora é com você!

O laço while é a estrutura que repete um bloco de código enquanto uma condição for verdadeira. While significa “enquanto”. A condição é testada antes de cada volta. Quando ela fica falsa, o laço termina.

Quem diria… O mundo gira, dá voltas, e o laço while também. No artigo sobre o laço for, a repetição vinha com um contador pronto: início, condição e passo. O while fica só com uma dessas três partes, a condição. O resto é por sua conta.

Pense em encher um copo d’água. Enquanto o copo não estiver cheio, você continua despejando. Você não conta os segundos antes de começar: só fica de olho na condição.

Como funciona o laço while?

O while faz sempre a mesma sequência:

  • Testa a condição.
  • Se ela for verdadeira, executa o bloco e volta para o teste.
  • Se ela for falsa, o laço termina e o programa segue.

ATENÇÃO: como o teste vem antes, se a condição já começa falsa, o bloco não é executado nenhuma vez.

Para ver a diferença em relação ao for, compare a mesma contagem de 1 a 5 nos dois laços:

A contagem de 1 a 5 escrita com for e com while, com o início, a condição e o passo numerados nos dois códigos
As três partes continuam existindo no while. O início sai para antes do laço, e o passo vai para dentro do corpo.

No for, início, condição e passo ficam juntos na mesma linha. No while, quem cuida do início e do passo é você.

Quando usar for e quando usar while?

O for combina com as repetições em que você sabe de antemão quantas voltas serão. O while serve para quando a parada depende de algo que acontece durante a repetição. Ele não se “importa” com a contagem: enquanto a condição for verdadeira, ele continua.

Veja um exemplo. Quantas vezes dá para dividir 100 por 2, jogando o resto fora, até chegar em 1? Você não sabe antes de fazer a conta. O while descobre: 50, 25, 12, 6, 3, 1. Foram 6 divisões.

Ver a animação do while dividindo 100 por 2
Animação do laço while dividindo 100 por 2 até chegar em 1, com o contador de divisões indo de 0 a 6
A cada volta, a condição n > 1 é testada. Quando o n chega em 1, o teste dá falso e o laço termina, com 6 divisões contadas.

E os laços não servem só para números. O que decide se o laço continua é a condição ser verdadeira, e ela pode ser uma variável que guarda verdadeiro ou falso. No programa abaixo, enquanto a variável ainda_existe_amor for verdadeira, o laço continua. No terceiro chifre, ela vira falsa e o laço termina. Sacou?

Como usar o laço while em Python, PHP e C?

O programa junta cinco usos do while e, no fim, compara o teste feito antes e o teste feito depois de cada volta.

Python:

# Laço while: repetir enquanto uma condição for verdadeira

print("Contagem de 1 a 5:")
i = 1
while i <= 5:
    print(i)
    i = i + 1

print("Dividindo 100 por 2 até chegar em 1:")
n = 100
divisoes = 0
while n > 1:
    n = n // 2
    divisoes = divisoes + 1
    print(n)
print("Foram %d divisões" % divisoes)

print("Somando 1 + 2 + 3... até passar de 50:")
soma = 0
numero = 0
while soma <= 50:
    numero = numero + 1
    soma = soma + numero
print("A soma passou de 50 no número %d e chegou a %d" % (numero, soma))

print("Lendo valores até encontrar o zero:")
valores = [7, 5, 8, 0, 9]
posicao = 0
soma = 0
while valores[posicao] != 0:
    soma = soma + valores[posicao]
    posicao = posicao + 1
print("Valores lidos: %d, soma: %d" % (posicao, soma))

print("Enquanto ainda existe amor:")
ainda_existe_amor = True
quantidade_de_chifres = 0
while ainda_existe_amor:
    quantidade_de_chifres = quantidade_de_chifres + 1
    if quantidade_de_chifres == 3:
        ainda_existe_amor = False
        print("Chifre número %d: acabou o amor" % quantidade_de_chifres)
    else:
        print("Chifre número %d: perdoado" % quantidade_de_chifres)

# testar antes ou testar depois, com uma condição que já começa falsa
n = 0
voltas = 0
while n > 0:
    voltas = voltas + 1
print("Testando antes de cada volta: %d voltas" % voltas)

voltas = 0
while True:
    voltas = voltas + 1
    if not (n > 0):
        break
print("Testando depois de cada volta: %d volta" % voltas)

PHP:

<?php
// Laço while: repetir enquanto uma condição for verdadeira

echo "Contagem de 1 a 5:\n";
$i = 1;
while ($i <= 5) {
    echo $i, "\n";
    $i = $i + 1;
}

echo "Dividindo 100 por 2 até chegar em 1:\n";
$n = 100;
$divisoes = 0;
while ($n > 1) {
    $n = intdiv($n, 2);
    $divisoes = $divisoes + 1;
    echo $n, "\n";
}
printf("Foram %d divisões\n", $divisoes);

echo "Somando 1 + 2 + 3... até passar de 50:\n";
$soma = 0;
$numero = 0;
while ($soma <= 50) {
    $numero = $numero + 1;
    $soma = $soma + $numero;
}
printf("A soma passou de 50 no número %d e chegou a %d\n", $numero, $soma);

echo "Lendo valores até encontrar o zero:\n";
$valores = [7, 5, 8, 0, 9];
$posicao = 0;
$soma = 0;
while ($valores[$posicao] != 0) {
    $soma = $soma + $valores[$posicao];
    $posicao = $posicao + 1;
}
printf("Valores lidos: %d, soma: %d\n", $posicao, $soma);

echo "Enquanto ainda existe amor:\n";
$ainda_existe_amor = true;
$quantidade_de_chifres = 0;
while ($ainda_existe_amor) {
    $quantidade_de_chifres = $quantidade_de_chifres + 1;
    if ($quantidade_de_chifres == 3) {
        $ainda_existe_amor = false;
        printf("Chifre número %d: acabou o amor\n", $quantidade_de_chifres);
    } else {
        printf("Chifre número %d: perdoado\n", $quantidade_de_chifres);
    }
}

// testar antes ou testar depois, com uma condição que já começa falsa
$n = 0;
$voltas = 0;
while ($n > 0) {
    $voltas = $voltas + 1;
}
printf("Testando antes de cada volta: %d voltas\n", $voltas);

$voltas = 0;
do {
    $voltas = $voltas + 1;
} while ($n > 0);
printf("Testando depois de cada volta: %d volta\n", $voltas);

C:

/* Laço while: repetir enquanto uma condição for verdadeira */
#include <stdio.h>
#include <stdbool.h>

int main(void) {
    printf("Contagem de 1 a 5:\n");
    int i = 1;
    while (i <= 5) {
        printf("%d\n", i);
        i = i + 1;
    }

    printf("Dividindo 100 por 2 até chegar em 1:\n");
    int n = 100;
    int divisoes = 0;
    while (n > 1) {
        n = n / 2;
        divisoes = divisoes + 1;
        printf("%d\n", n);
    }
    printf("Foram %d divisões\n", divisoes);

    printf("Somando 1 + 2 + 3... até passar de 50:\n");
    int soma = 0;
    int numero = 0;
    while (soma <= 50) {
        numero = numero + 1;
        soma = soma + numero;
    }
    printf("A soma passou de 50 no número %d e chegou a %d\n", numero, soma);

    printf("Lendo valores até encontrar o zero:\n");
    int valores[] = {7, 5, 8, 0, 9};
    int posicao = 0;
    soma = 0;
    while (valores[posicao] != 0) {
        soma = soma + valores[posicao];
        posicao = posicao + 1;
    }
    printf("Valores lidos: %d, soma: %d\n", posicao, soma);

    printf("Enquanto ainda existe amor:\n");
    bool ainda_existe_amor = true;
    int quantidade_de_chifres = 0;
    while (ainda_existe_amor) {
        quantidade_de_chifres = quantidade_de_chifres + 1;
        if (quantidade_de_chifres == 3) {
            ainda_existe_amor = false;
            printf("Chifre número %d: acabou o amor\n", quantidade_de_chifres);
        } else {
            printf("Chifre número %d: perdoado\n", quantidade_de_chifres);
        }
    }

    /* testar antes ou testar depois, com uma condição que já começa falsa */
    n = 0;
    int voltas = 0;
    while (n > 0) {
        voltas = voltas + 1;
    }
    printf("Testando antes de cada volta: %d voltas\n", voltas);

    voltas = 0;
    do {
        voltas = voltas + 1;
    } while (n > 0);
    printf("Testando depois de cada volta: %d volta\n", voltas);
    return 0;
}

Saída:

Contagem de 1 a 5:
1
2
3
4
5
Dividindo 100 por 2 até chegar em 1:
50
25
12
6
3
1
Foram 6 divisões
Somando 1 + 2 + 3... até passar de 50:
A soma passou de 50 no número 10 e chegou a 55
Lendo valores até encontrar o zero:
Valores lidos: 3, soma: 20
Enquanto ainda existe amor:
Chifre número 1: perdoado
Chifre número 2: perdoado
Chifre número 3: acabou o amor
Testando antes de cada volta: 0 voltas
Testando depois de cada volta: 1 volta

Foque no conceito, e não na linguagem! Repare em cada bloco:

  • Contagem de 1 a 5: o início (i = 1) vem antes do laço, e o passo (i = i + 1) é a última linha do corpo.
  • Divisões: ninguém informou o número de voltas. O laço parou sozinho quando o n chegou em 1.
  • Soma até passar de 50: a condição olha para a soma, e não para um contador. A soma passou de 50 quando entrou o número 10, e chegou a 55.
  • Leitura até o zero: o zero funciona como aviso de fim. O laço leu três valores, somou 20 e parou. O 9, que vem depois do zero, nem foi olhado.
  • Enquanto ainda existe amor: a condição é uma variável que guarda verdadeiro ou falso, trocada dentro do corpo.

O que é o do-while?

É um laço muito parecido com o while, com uma diferença: a condição é testada no fim de cada volta, e não no começo. Por isso, o do-while garante que o bloco seja executado pelo menos uma vez.

Dois fluxos lado a lado: no while a condição é testada antes do corpo, no do-while o corpo roda antes do teste da condição
No while, a condição falsa impede até a primeira volta. No do-while, a primeira volta acontece antes do primeiro teste.

As duas últimas linhas da saída mostram isso. A condição n > 0 já começa falsa, porque o n vale 0. Testando antes, foram 0 voltas. Testando depois, foi 1 volta. Em PHP e em C, usei o do-while. No programa em Python, cheguei ao mesmo resultado com while True e um break no fim do corpo: o break encerra o laço na hora.

Aí você pergunta: e se a condição nunca ficar falsa?

Aí o programa entra no laço e nunca mais sai. É o laço infinito. Testei em C a contagem de 1 a 5 sem a linha do passo: o i ficou parado no 1, e a condição “menor ou igual a 5” continuou verdadeira para sempre. Interrompi o programa na volta 1.000.000, com o i ainda valendo 1.

Antes de rodar um while, faça uma pergunta: alguma linha dentro do corpo muda o que a condição testa? Se a resposta for não, o laço não vai terminar.

Quais são os erros mais comuns com o laço while?

  • Esquecer o passo dentro do corpo. A condição nunca muda, e o laço não termina.
  • Esquecer o início antes do laço. A variável da condição precisa ter um valor antes do primeiro teste.
  • Errar o limite por um. Com “menor que 5” no lugar de “menor ou igual a 5”, a contagem para no 4.
  • Confundir while com do-while. Com a condição falsa desde o início, um dá 0 voltas e o outro dá 1.
  • Esquecer o aviso de fim. Testei em Python a leitura até o zero com um vetor sem zero nenhum, [7, 5, 8, 9]. O laço passou do fim do vetor, e o programa foi interrompido com IndexError: list index out of range.

Agora é com você!

No papel:

  • O n começa em 64. Enquanto o n for maior que 1, ele é dividido por 2. Quantas voltas o laço dá?
  • O i começa em 10. Enquanto o i for maior que 0, o programa mostra o i e depois subtrai 3. Quais valores aparecem?
  • Reescreva com while um for que começa em 2, tem a condição “menor ou igual a 10” e o passo i += 2.

No computador:

  • Faça uma contagem regressiva de 10 até 1 com while.
  • Some os valores de um vetor até encontrar um número negativo.
  • Comece com o número 1 e vá dobrando. Descubra quantas vezes é preciso dobrar até passar de 1000.

Tente sozinho, sem pedir a resposta pronta para ninguém, nem para a IA!

Nos exemplos em Java que usei na primeira versão deste artigo, todo programa ficava dentro de uma classe. É o assunto do próximo artigo: o que são classes. Até lá!

Confiança Sempre!!!

Fontes:

Sobre quem escreve

Walmir Silva

Olá! Sou Walmir, engenheiro de software com MBA em Engenharia de Software e o cérebro por trás do GrowthCode e autor do livro "Além do Código".

Se você acha que programação é apenas sobre escrever código, prepare-se para expandir seus horizontes. Aqui, nós vamos além do código e exploramos as interseções fascinantes entre tecnologia, negócios, artes e filosofia.

Você está em busca de crescimento na carreira? Quer se destacar em um mercado competitivo? Almeja uma vida mais rica em conhecimento e realização? Então você chegou ao lugar certo. No GrowthCode, oferecemos insights profundos, estratégias comprovadas e um toque de sabedoria filosófica para catalisar seu crescimento pessoal e profissional.

Ver todos os artigos →

Continue a conversa

Compartilhe sua perspectiva

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Encontre sua próxima resposta

O que você quer aprender?

Preferências de cookies

Os cookies opcionais começam desligados. Você pode mudar a escolha a qualquer momento por esta tela.

NecessáriosSempre ativos

Guardam a sua escolha de cookies e mantêm o site funcionando. Não são usados para publicidade.

Contam visitas e mostram como o site é usado: Google Analytics e Microsoft Clarity, carregados pelo Google Tag Manager. Como esse contêiner também carrega tags de publicidade, as estatísticas só são ativadas junto com Publicidade e marketing.

Exibem anúncios do Google AdSense e medem campanhas e e-mails: pixels da Meta e do TikTok e o Mautic.

Permite que o Google escolha anúncios com base nos seus interesses. Desligado, os anúncios aparecem sem personalização. Depende de Publicidade e marketing.

Também é possível bloquear cookies nas configurações do navegador. Detalhes na Política de privacidade.