Teste seu entendimento sobre for, while, break e laços aninhados.
Questão 1 — Contagem de iterações de um laço for
int sum = 0;
for (int i = 1; i <= 5; i++) {
sum += i;
}
printf("sum = %d\n", sum);
O que isso imprime?
sum = 5
sum = 15
sum = 10
sum = 14
Explicação: O laço executa 5 vezes com i=1,2,3,4,5. 1+2+3+4+5 = 15.
Questão 2 — Término do laço while
int x = 10;
while (x > 0) {
x -= 3;
}
printf("x = %d\n", x);
O que isso imprime?
x = 0
x = 1
x = -2
x = 3
Explicação: x evolui: 10 → 7 → 4 → 1 → -2. Quando x=-2, x > 0 é falso e o laço termina. Como x -= 3 subtrai 3 a cada vez, o laço pode ultrapassar zero.
Questão 3 — Comportamento do break
for (int i = 0; i < 10; i++) {
if (i == 3) break;
printf("%d ", i);
}
O que isso imprime?
0 1 2 3
0 1 2
0 1 2 3 4 5 6 7 8 9
3
Explicação: Quando i==3, break sai do laço imediatamente. O break acontece antes do printf, então 3 nunca é impresso. A saída é apenas 0 1 2 (i=0, 1, 2).
Questão 4 — Iterações em laço aninhado
int count = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
count++;
}
}
printf("count = %d\n", count);
O que isso imprime?
count = 7
count = 12
count = 3
count = 4
Explicação: Laço externo 3 vezes × laço interno 4 vezes = 12 iterações. Em laços aninhados, o total de iterações é externo × interno.
Questão 5 — A diferença entre < e <=
int count = 0;
for (int i = 1; i <= 5; i++) {
count++;
}
printf("count = %d\n", count);
O que isso imprime?
count = 4
count = 5
count = 6
count = 1
Explicação:i <= 5 inclui i=5, então o laço executa para i=1, 2, 3, 4, 5 — 5 iterações.
for (i=1; i<=5; i++) → 5 iterações (i=1..5)
for (i=1; i<5; i++) → 4 iterações (i=1..4)
Alternar entre < e <= muda a contagem em um — um erro clássico de "off-by-one".
Questão 6 — Como o continue se comporta
for (int i = 0; i < 5; i++) {
if (i == 2) continue;
printf("%d ", i);
}
O que isso imprime?
0 1
0 1 2 3 4
0 1 3 4
2
Explicação:continuepula apenas a iteração atual e vai para a próxima.
break: sai do laço inteiro
continue: pula o resto desta iteração e segue adiante
Quando i=2, o printf é pulado, então a saída é 0 1 3 4.
Questão 7 — do-while executa pelo menos uma vez
int i = 10;
do {
printf("%d ", i);
i++;
} while (i < 5);
O que isso imprime?
(nada)
10
10 11 12 13 14
Laço infinito
Explicação: Num laço do-while, a condição é verificada no final de cada iteração.
O corpo sempre executa pelo menos uma vez
A primeira iteração imprime i=10, depois i se torna 11
11 < 5 é falso, então o laço termina
Um while simples nunca entraria no corpo porque a condição já é falsa desde o início. Um do-while sempre executa pelo menos uma vez.
Questão 8 — Qual é um laço infinito?
// Qual dos seguintes é um laço infinito?// A) for (int i = 0; i < 10; i++) { ... }// B) while (1) { ... } // sem break// C) for (int i = 0; i < 10; ) { i++; }// D) int i = 0; while (i < 10) { i++; }
Qual é um laço infinito?
A
B
C
D
Explicação: A condição em while (1) é sempre verdadeira, então nunca termina a menos que você faça break.
A: sai quando i chega a 10 (10 iterações)
B: sempre verdadeiro → laço infinito
C: o corpo incrementa i, então termina em 10
D: i++ avança i, então termina
Laços infinitos são usados intencionalmente em coisas como event loops — só garanta que sempre haja uma condição de saída (um break).
Questão 9 — break dentro de laços aninhados
int count = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (j == 2) break;
count++;
}
}
printf("count = %d\n", count);
O que isso imprime?
count = 9
count = 6
count = 3
count = 0
Explicação:break sai apenas do laço mais interno que o contém; o laço externo continua.
Laço interno: count++ executa para j=0 e j=1, depois break em j=2
Ou seja, cada passada interna faz count++ duas vezes
Laço externo 3 vezes × interno 2 vezes = 6
Para sair também do laço externo, use uma variável flag, um goto, ou extraia o código para uma função e dê return.
Questão 10 — Contagem regressiva com i--
Colocar i-- no passo de atualização de um laço for permite contar em ordem decrescente.
for (int i = 5; i >= 0; i--) {
printf("%d ", i);
}
O que isso imprime?
0 1 2 3 4 5
5 4 3 2 1 0
5 4 3 2 1
Laço infinito
Explicação: Decompondo as três partes do for:
Inicialização:i = 5 (começa em 5)
Condição:i >= 0 (continua enquanto ≥ 0)
Atualização:i-- (decrementa 1 a cada iteração)
i é impresso como 5, 4, 3, 2, 1, 0. Quando i se torna -1 a condição é falsa → o laço termina → 5 4 3 2 1 0. Quando usar: percorrer um vetor de trás para frente, displays de contagem regressiva, inverter dados e assim por diante.
Questão 11 — for(;;) como laço infinito
Todas as três partes de um laço for podem ser omitidas. O que acontece quando são?
int count = 0;
for (;;) {
count++;
if (count == 3) break;
}
printf("count = %d\n", count);
O que isso imprime?
count = 0 (o laço não executa)
Erro de compilação
count = 3
Laço infinito, nunca para
Explicação:for (;;) tem as três partes omitidas:
Sem inicialização
Sem condição → tratada como sempre verdadeira
Sem atualização
É o idiom padrão para um laço infinito (equivalente a while (1)).
Aqui, o if (count == 3) break; dentro do corpo fornece a saída. Quando count chega a 3 o laço termina e "count = 3" é impresso. Quando usar: laços de espera de menu, esperas por eventos — qualquer caso em que a condição de saída se encaixa mais naturalmente dentro do corpo.
Questão 12 — Passo de 2 em 2 com i += 2
Mudar o passo de atualização de i++ para outra coisa permite alterar a distância entre valores.
for (int i = 0; i <= 10; i += 2) {
printf("%d ", i);
}
O que isso imprime?
0 1 2 3 4 5 6 7 8 9 10
1 3 5 7 9
0 2 4 6 8 10
2 4 6 8 10
Explicação: As três partes do laço for:
Inicialização:i = 0
Condição:i <= 10 (até 10 inclusive)
Atualização:i += 2 (soma 2 a cada iteração)
i avança 0, 2, 4, 6, 8, 10. O próximo valor (12) falha na condição → o laço termina → 0 2 4 6 8 10. Obs.: Como usamos <= 10, 10 é incluído. Trocando para < 10, ele é excluído, ficando "0 2 4 6 8". Quando usar: processar apenas números pares, amostrar a cada terceiro pixel, ou andar para trás com i -= 3.
Resultado
Responda todas as questões para ver sua pontuação.