1
resposta

[Dúvida] Necessidade da variável nao_acertou após a mudança do tipo de laço

Minha dúvida é referente a implementação mostrada no vídeo e a necessidade de continuar usando a variável nao_acertou após trocar a ferramenta de repetição while por for.
Se nas condições do laço não declaramos a variável, por que ela continua sendo parte do if seguida de um break?
Nas condicionais se o if for verdadeiro a leitura já pula para o final do código, certo?

1 resposta

Oi, Pedro.

É um questionamento muito comum quando estamos transicionando entre diferentes estruturas de controle e ajustando a lógica de encerramento do programa.

Vamos analisar por que a variável nao_acertou continua ali, mesmo com o uso do break e do laço for.

O papel da variável de estado:

Embora o comando break interrompa o laço de repetição imediatamente quando o jogador acerta, o programa continua a execução nas linhas que aparecem logo após o fechamento das chaves do for.

A variável nao_acertou funciona como uma memória do resultado. Sem ela, o programa teria dificuldades em distinguir, ao chegar no final do código, se o laço terminou porque o jogador esgotou todas as tentativas ou porque ele acertou o número.

Por que o break sozinho não basta?

Quando o compilador encontra o break, ele "pula" para fora do laço. No seu código, logo após o laço, existe esta verificação:

if (nao_acertou){
    cout << "Você perdeu! Tente novamente!" << endl;
}
else {
    // Exibe a pontuação de quem venceu
}

Se não usássemos a variável nao_acertou = false dentro do bloco do acerto, ao sair do laço (seja pelo break ou pelo fim das tentativas), o programa não saberia qual mensagem exibir.

  • Se você acertar: O código define nao_acertou = false, executa o break, sai do laço e entra no else para mostrar sua pontuação.
  • Se você esgotar as tentativas: O laço termina naturalmente, a variável nao_acertou permanece como true (seu valor inicial), e o programa exibe a mensagem de derrota.

A ordem de execução

Você mencionou que se o if for verdadeiro, a leitura pularia para o final do código. Na verdade, o if apenas executa o bloco de código que está entre as suas chaves { }.

O que faz "pular" para fora da repetição é especificamente o comando break. Mas ele apenas te tira de dentro do for. Ele não encerra o programa inteiro nem pula as linhas que verificam se você ganhou ou perdeu lá no final.

Existe alternativa?

Sim, existem outras formas de estruturar isso, como colocar a mensagem de vitória e a pontuação diretamente dentro do if(acertou) e usar um return 0 para encerrar o programa ali mesmo. Porém, manter a lógica de mensagens ao final ajuda a organizar o fluxo, deixando o processamento do jogo dentro do laço e a exibição do resultado final fora dele.

Conteúdos relacionados
Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!