break e continueControlando o fluxo interno dos loops — quando sair, quando pular
for, while, do-while) e também dentro do switch. O conteúdo complementa as Aulas 08–11 e é especialmente útil antes de estudar funções e algoritmos de busca.
Em C (e em Java), toda estrutura de repetição segue um ciclo natural: testa a condição, executa o bloco, repete. Às vezes, porém, precisamos interromper esse ciclo antes do previsto ou pular uma iteração específica. Para isso existem dois comandos:
| Comando | Efeito imediato | Onde pode ser usado |
|---|---|---|
break |
Encerra o loop (ou switch) imediatamente e transfere o controle para a instrução seguinte ao bloco |
for, while, do-while, switch |
continue |
Abandona o restante do bloco da iteração atual e vai direto para o próximo ciclo (re-teste da condição) | for, while, do-while |
break mata o loop. continue pula uma volta do loop. O loop continua existindo após um continue; após um break, ele termina.
breakbreak interrompe imediatamente a execução do bloco mais interno em que está contido (loop ou switch) e passa o controle para a primeira instrução após aquele bloco. Nenhuma linha restante do bloco é executada.
break?O uso mais clássico de break: parar assim que encontrar o elemento procurado, sem continuar varrendo o array desnecessariamente.
#include <stdio.h>
int main() {
int v[] = {4, 7, 2, 9, 1, 5, 8};
int n = 7;
int alvo = 9;
int encontrado = 0;
for (int i = 0; i < n; i++) {
if (v[i] == alvo) {
printf("Encontrado %d na posição %d.\n", alvo, i);
encontrado = 1;
break; // para o loop — não precisa continuar
}
}
if (!encontrado)
printf("%d não está no vetor.\n", alvo);
return 0;
}
break, o loop continuaria percorrendo os elementos 1, 5 e 8 mesmo após encontrar o 9 — trabalho desnecessário. Em arrays grandes, isso pode fazer diferença real de performance.
O idioma while(1) com break interno é muito comum em C para loops cuja condição de saída é complexa ou ocorre no meio do bloco:
#include <stdio.h>
int main() {
int n;
while (1) { // loop infinito intencional
printf("Digite um número positivo: ");
scanf("%d", &n);
if (n > 0) break; // saída no meio do bloco
printf("Inválido! Tente novamente.\n");
}
printf("Você digitou: %d\n", n);
return 0;
}
do-while com condição de saída no meio. Muitos programadores C preferem o while(1) + break quando a condição de saída é mais complexa ou precisa ser verificada após algumas instruções.
O break é obrigatório no switch para evitar o fall-through — a execução "caindo" para o caso seguinte:
#include <stdio.h>
int main() {
int opcao = 2;
switch (opcao) {
case 1:
printf("Opção 1\n");
break; // sem este break, continuaria no case 2!
case 2:
printf("Opção 2\n");
break;
case 3:
printf("Opção 3\n");
break;
default:
printf("Opção inválida\n");
}
return 0;
}
break em um case, a execução continua para o próximo case automaticamente — mesmo que a condição não corresponda. Isso é raramente o que se quer e é fonte frequente de bugs.
switch (2) {
case 1: printf("um\n");
case 2: printf("dois\n"); // executa (opcao == 2)
case 3: printf("três\n"); // também executa! (fall-through)
}
continuecontinue abandona o restante do bloco da iteração atual e passa imediatamente para o próximo ciclo do loop: no for, executa o incremento e então testa a condição; no while e do-while, vai direto para o re-teste da condição.
continue?| Loop | Após o continue, vai para... |
|---|---|
for (init; cond; incr) |
Executa incr primeiro, depois testa cond |
while (cond) |
Vai direto para o re-teste de cond |
do { } while (cond) |
Vai direto para o re-teste de cond |
#include <stdio.h>
int main() {
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) continue; // pula os pares
printf("%d ", i);
}
printf("\n");
return 0;
}
#include <stdio.h>
int main() {
int v[] = {3, -1, 7, -4, 2, -8, 5};
int n = 7, soma = 0;
for (int i = 0; i < n; i++) {
if (v[i] <= 0) continue; // ignora negativos e zero
soma += v[i];
printf("Somando v[%d] = %d → soma = %d\n", i, v[i], soma);
}
printf("Soma dos positivos: %d\n", soma);
return 0;
}
No for, o incremento (i++) é executado automaticamente mesmo após um continue. No while, o incremento está dentro do bloco — e se vier depois do continue, nunca será executado:
int i = 0;
while (i < 5) {
if (i % 2 == 0) continue; // pula...
printf("%d ", i);
i++; // nunca chega aqui quando i é par!
}
i fica em 0 para sempre → loop infinito.
int i = 0;
while (i < 5) {
i++; // incrementa primeiro
if (i % 2 == 0) continue; // aí pula
printf("%d ", i);
}
continue. No for, isso não é problema porque o incremento fica fora do bloco.
break e continue afetam apenas o loop (ou switch) mais interno em que aparecem. Um break dentro de um for aninhado sai apenas daquele for interno — o for externo continua normalmente.
#include <stdio.h>
int main() {
for (int i = 1; i <= 3; i++) {
printf("i = %d: ", i);
for (int j = 1; j <= 5; j++) {
if (j == 3) break; // sai apenas do for interno
printf("%d ", j);
}
printf("\n");
}
return 0;
}
O break encerrou o loop de j a cada iteração de i, mas o loop externo (de i) continuou normalmente até o fim.
C não tem uma sintaxe nativa para sair de múltiplos loops de uma vez (como o break label do Java). A solução idiomática em C é usar uma variável flag:
#include <stdio.h>
#include <stdbool.h>
int main() {
int m[3][3] = {{1,2,3},{4,0,6},{7,8,9}};
bool achou = false;
int li, lj;
for (int i = 0; i < 3 && !achou; i++) { // condição extra na própria linha
for (int j = 0; j < 3 && !achou; j++) {
if (m[i][j] == 0) {
achou = true;
li = i; lj = j;
}
}
}
if (achou)
printf("Zero encontrado em [%d][%d]\n", li, lj);
return 0;
}
&& !achou diretamente na condição do for é mais elegante do que usar break + flag separada: assim que achou se torna true, ambos os loops param naturalmente no próximo teste de condição.
C possui a instrução goto, que permite saltar para um label dentro da mesma função. É uma das raras situações em que seu uso é considerado aceitável pela comunidade C:
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (m[i][j] == 0) goto fim; // sai de ambos os loops
}
}
fim:
printf("Saiu dos dois loops.\n");
goto torna o código difícil de ler e manter. Evite-o na maioria dos casos. A exceção mais aceita é exatamente esta — sair de loops profundamente aninhados. Para todo o resto, prefira flags ou refatoração em funções.
| Aspecto | C | Java |
|---|---|---|
| Sintaxe básica | Idêntica: break; e continue; |
Idêntica: break; e continue; |
| Escopo de atuação | Apenas o loop/switch mais interno | Apenas o loop/switch mais interno |
| Sair de loops aninhados | Flag booleana ou goto label (uso raro, mas válido) |
break label; e continue label; — sintaxe nativa |
| continue em switch | continue não é válido dentro de switch isolado — precisa haver um loop externo |
Mesmo comportamento |
| Fall-through no switch | Ocorre se break for omitido — comportamento padrão |
Ocorre se break for omitido — mesmo comportamento |
| break fora de loop/switch | Erro de compilação | Erro de compilação |
| continue com incremento em while | Perigo de loop infinito se incremento vier depois do continue |
Mesmo perigo — comportamento idêntico |
externo:
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (m[i][j] == 0)
break externo; // sai de AMBOS
}
}
✅ Sintaxe nativa em Java.
bool achou = false;
for (int i=0; i<3 && !achou; i++) {
for (int j=0; j<3 && !achou; j++) {
if (m[i][j] == 0)
achou = true;
}
}
⚠️ Requer variável auxiliar.
Um programa que combina break (para sair do menu) e continue (para filtrar entradas dentro de uma operação):
#include <stdio.h>
int main() {
int opcao, n, soma;
do {
printf("\n=== MENU ===\n");
printf("1. Somar apenas números positivos\n");
printf("2. Contar ímpares de 1 a N\n");
printf("0. Sair\n");
printf("Escolha: ");
scanf("%d", &opcao);
if (opcao == 0) break; // sai do do-while
if (opcao == 1) {
int v[] = {5, -2, 8, -1, 3, -7, 4};
soma = 0;
for (int i = 0; i < 7; i++) {
if (v[i] <= 0) continue; // pula negativos
soma += v[i];
}
printf("Soma dos positivos: %d\n", soma);
} else if (opcao == 2) {
printf("Digite N: ");
scanf("%d", &n);
int cont = 0;
for (int i = 1; i <= n; i++) {
if (i % 2 == 0) continue; // pula pares
cont++;
}
printf("Ímpares de 1 a %d: %d\n", n, cont);
} else {
printf("Opção inválida!\n");
}
} while (1); // loop infinito — sai pelo break acima
printf("Até logo!\n");
return 0;
}
Responda às questões abaixo e clique em Verificar Respostas para conferir.