🔁 Laços e Condicionais · Estruturas de Controle · C/C++

🔁 Laços e Condicionais

"Estruturas de controle são os mecanismos que permitem alterar o fluxo linear de execução de um programa, tomando decisões (condicionais) ou repetindo blocos de código (laços)."

Todo programa útil precisa tomar decisões e repetir tarefas. As estruturas de controle são os blocos fundamentais que permitem implementar lógica condicional e iterações. C/C++ oferece um conjunto rico e flexível dessas estruturas, herdado do C e expandido no C++ moderno.

🔀 Condicionais

As estruturas condicionais permitem executar diferentes blocos de código com base em condições lógicas.

📌 if e else

A estrutura mais básica: executa um bloco se a condição for verdadeira, opcionalmente executa outro bloco se for falsa.

int idade = 18; if (idade >= 18) { cout << "Maior de idade" << endl; } else if (idade >= 16) { cout << "Pode votar (facultativo)" << endl; } else { cout << "Menor de idade" << endl; } // Forma compacta (operador ternário) string status = (idade >= 18) ? "Adulto" : "Jovem";

📌 switch

Útil para múltiplas escolhas baseadas no valor de uma expressão inteira ou enumerada. Mais legível e potencialmente mais eficiente que longas cadeias de if-else.

int dia = 3; switch (dia) { case 1: cout << "Domingo" << endl; break; case 2: cout << "Segunda-feira" << endl; break; case 3: cout << "Terça-feira" << endl; break; // ... outros casos ... default: cout << "Dia inválido" << endl; }
⚠️ Não esqueça o break! Sem o break, a execução "cai" para o próximo caso (fall-through), o que pode ser desejado em situações específicas, mas geralmente é um erro.

📌 Switch com Fall-through Controlado (C++17)

Para documentar intencionalmente a ausência de break, use o atributo [[fallthrough]].

switch (valor) { case 1: cout << "Um, "; [[fallthrough]]; // Indica que a queda é intencional case 2: cout << "Dois" << endl; break; }

🔄 Laços de Repetição

Os laços permitem executar um bloco de código múltiplas vezes.

🔹 for

Ideal quando o número de iterações é conhecido antecipadamente.

for (int i = 0; i < 10; i++)

🔹 while

Executa enquanto a condição for verdadeira. A condição é verificada antes de cada iteração.

while (condicao) { ... }

🔹 do-while

Executa o bloco pelo menos uma vez, pois a condição é verificada depois.

do { ... } while (condicao);

📌 Laço for

// for tradicional for (int i = 0; i < 5; i++) { cout << "i = " << i << endl; } // Múltiplas variáveis no for for (int i = 0, j = 10; i < j; i++, j--) { cout << i << " - " << j << endl; } // Range-based for (C++11) — para arrays e containers int numeros[] = {1, 2, 3, 4, 5}; for (int n : numeros) { cout << n << " "; }

📌 Laço while

int contador = 0; while (contador < 5) { cout << contador << " "; contador++; } // Loop infinito (útil com break interno) while (true) { // processa algo... if (condicao_de_saida) break; }

📌 Laço do-while

int opcao; do { cout << "Menu:\n1. Opção 1\n2. Opção 2\n0. Sair\nEscolha: "; cin >> opcao; // processa opção... } while (opcao != 0);

🛑 Controle de Fluxo nos Laços

Duas palavras-chave permitem controlar a execução dentro dos laços.

ComandoEfeito
breakEncerra imediatamente o laço mais interno.
continuePula para a próxima iteração do laço, ignorando o restante do bloco atual.
for (int i = 0; i < 10; i++) { if (i == 5) break; // Sai do laço quando i == 5 if (i % 2 == 0) continue; // Pula os pares cout << i << " "; // Imprime apenas ímpares: 1 3 }

📊 Comparação dos Laços

LaçoQuando UsarNúmero de Execuções
forNúmero de iterações conhecido ou baseado em contador0 ou mais
whileCondição deve ser verificada antes de executar0 ou mais
do-whileBloco deve ser executado pelo menos uma vez1 ou mais

⚠️ Cuidados e Boas Práticas

  • Evite loops infinitos acidentais: Certifique-se de que a condição de parada será eventualmente atingida.
  • Prefira for quando o número de iterações for conhecido.
  • Use chaves {} mesmo para blocos de uma linha: Evita erros ao adicionar novas linhas depois.
  • Em C++, prefira range-based for (for (auto x : container)) para iterar sobre coleções.
  • Cuidado com condições complexas no while: Considere extrair a lógica para uma função se ficar difícil de ler.
⚠️ Cuidado com ponto-e-vírgula! Um ; após a condição de um while ou for cria um corpo vazio, geralmente resultando em loop infinito ou comportamento inesperado.
while (condicao); // Loop infinito! (corpo vazio) { // Este bloco não faz parte do while! }

🔗 Conclusão

Dominar laços e condicionais é o primeiro passo para escrever programas verdadeiramente dinâmicos e responsivos. A combinação adequada de if, switch, for, while e do-while permite implementar qualquer lógica de controle necessária. Com a prática, a escolha da estrutura mais adequada para cada situação se torna natural, resultando em código mais limpo, eficiente e fácil de manter.

⏭️ Próximo: Ponteiros...

Postar um comentário

0 Comentários