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 com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!