Revise as aulas 16 a 23 com uma folha de consulta, seis questões de leitura de código e uma lista de erros frequentes.
for (int i = 0; i < 3; i++) { printf("%d ", i); } // Saída: 0 1 2
// Testa a condição → executa while (cond) { // Zero ou mais vezes } // Executa → testa a condição do { // Executa pelo menos uma vez } while (cond);
; ao final)for (int i = 0; i < 5; i++) { if (i == 3) break; // Sai → 0 1 2 if (i == 2) continue; // Pula apenas esta iteração printf("%d ", i); }
int a[5] = {10, 20, 30, 40, 50}; // Índices de 0 a N-1 (aqui, de 0 a 4) printf("%d\n", a[0]); // 10 printf("%d\n", a[4]); // 50 // a[5] está fora dos limites! Comportamento indefinido
for(i=0; i<N; i++) ... a[i] ...char s[] = "Hi"; // Memória: 'H' 'i' '\0' ← terminador \0 incluído automaticamente printf("%s\n", s); // Hi printf("%zu\n", strlen(s)); // 2 (não conta \0) printf("%zu\n", sizeof s); // 3 (inclui o espaço de \0)
\0. O literal de string inclui esse terminador automaticamente.strlen conta os caracteres antes de \0;sizeof mede o tamanho do objeto em bytes#include <string.h> declara strlen e outras funçõesfor (int i = 1; i <= 5; i++) { printf("%d ", i); }
i <= 5, o corpo é executado para i=1, 2, 3, 4 e 5: cinco vezes. Se a condição fosse i < 5, seriam apenas quatro execuções, exibindo 1 2 3 4. Confundir < e <= é uma causa comum de erros de limite.int i = 10; do { printf("%d ", i); i++; } while (i < 3);
do-while executa o corpo antes de testar a condição. Primeiro exibe 10 e incrementa i para 11; depois, 11 < 3 é falso e o laço termina. A saída é 10. Com while, a condição inicial seria falsa e o corpo não executaria nenhuma vez. do-while sempre executa ao menos uma vez.int a[] = {2, 4, 6, 8}; int sum = 0; for (int i = 0; i < 4; i++) sum += a[i]; printf("%d\n", sum);
0 → 2 → 6 → 12 → 20; a saída é 20. Um percurso comum com for visita os índices de 0 a N-1.for (int i = 0; i < 5; i++) { if (i == 3) break; printf("%d ", i); }
break encerra o laço inteiro, antes do printf dessa iteração. Portanto, a saída é 0 1 2. Se fosse continue, apenas a iteração de i=3 seria pulada, produzindo 0 1 2 4.int a[3] = {10, 20, 30}; for (int i = 0; i <= 3; i++) { printf("%d ", a[i]); }
i <= 3 também acessa a[3], fora dos limites: um erro off-by-one. C não verifica esses limites automaticamente; o acesso causa comportamento indefinido, podendo parecer funcionar, falhar ou corromper memória. Use i < N.#include <stdio.h> #include <string.h> int main(void) { char s[10] = "Hello"; printf("%zu\n", strlen(s)); return 0; }
strlen conta os caracteres antes de \0, sem incluir o terminador. "Hello" contém H, e, l, l e o: cinco caracteres. Já sizeof s, para o array deste exercício, vale 10, sua capacidade em bytes. strlen e sizeof medem coisas diferentes.i<5 executa cinco vezes; i<=5, seis. Em arrays, a iteração extra pode ultrapassar os limites.while(i<5) não atualizar i, por exemplo com i++, a condição pode continuar verdadeira para sempre. Deve existir um caminho que encerre o laço.break encerra o laço;continue avança à próxima iteração. Confundi-los muda a saída.
} while (cond);, com ponto e vírgula.strlen("Hi") vale 2 (caracteres);sizeof "Hi" vale 3 (bytes, incluindo \0). São medidas diferentes.