Neste artigo
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:

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

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.

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:
- PHP, manual oficial, while, com a expressão verificada no início de cada iteração e o caso em que ela é falsa desde o início e as instruções não são executadas nenhuma vez.
- PHP, manual oficial, do-while, com a expressão verificada ao final de cada iteração e a garantia de que a primeira iteração sempre é executada.
- Python, documentação oficial, referência da linguagem, instrução while, com a execução repetida enquanto a expressão for verdadeira e o efeito do break, que termina o laço (em inglês).
- Universidade Federal de Pernambuco, Centro de Informática, IF669, aula 17, com a inicialização da variável de controle feita fora do laço while, o incremento feito no corpo e o fluxo do do-while (PDF, slides de aula).
- Universidade Federal de Pernambuco, Centro de Informática, aula de Introdução à Programação sobre laços, com a equivalência entre o for e o while: inicialização antes, condição no while e incremento no fim do corpo (PDF, slides de aula).
- Universidade Federal de Pernambuco, Centro de Informática, Estruturas de Repetição, com o uso do for quando o número de repetições é conhecido de antemão (PDF, slides de aula).
- Universidade Federal de Uberlândia, FACOM, aula 06, Comandos de Repetição, com o comando while, que repete uma sequência de comandos enquanto uma condição for verdadeira (PDF, slides de aula).
- Unicamp, Instituto de Computação, MC102, aula 8, com a inicialização da variável, a condição de parada e a alteração da variável do laço em um exemplo com while (PDF, slides de aula).
- USP, e-Disciplinas, aula sobre comandos de repetição, com o while no lugar do for e o aviso de que a variável de controle deve ter o valor modificado dentro do laço.
- Unicamp, Instituto de Computação, MC-102, aula 05, Comandos Repetitivos, com o comando while e o laço infinito, em que o programa entra no laço e nunca sai (PDF, slides de aula).
- Os exemplos foram executados em Python 3.13, PHP 8.3 e GCC 13.

Continue a conversa