Diferença entre While e Do While em C
A diferença entre as estruturas de repetição While e do while é normalmente muito confusa para os estudantes.
Então, esta aula é dedicada exclusivamente a esse tópico.
Vamos discutir aqui a diferença entre as estruturas while e do while e aí vai ficar talvez mais claro como utilizar cada uma e em que situação utilizar cada um.
Vamos começar aqui com a estrutura while; então, lembrando, while pode ser traduzido como enquanto, e do while como faça enquanto.
A estrutura while, ela primeiro testa para depois executar um código interno; então isso significa que o código interno pode não ser executado nenhuma vez se o teste já for falso na primeira vez.
E aí vamos entender em detalhes isso aqui, olha só, eu tenho aqui a estrutura while, enquanto esse teste for verdadeiro, a gente faz o que está aqui dentro; mas e se o teste for falso já na primeira vez?
Se o teste for falso já na primeira vez, o código que está aqui dentro não vai ser executado nenhuma vez, então essa é uma das principais características da estrutura while, tenha isso em mente, porque agora nós vamos ver a estrutura do while e ver aí algumas diferenças.
Vamos subir aqui para a gente ter a nossa próxima tela, pronto!
E agora, olha só, na estrutura do while, ele primeiro executa um trecho de código, uma vez, para depois testar a condição, ou seja, o código será executado no mínimo uma vez; e aí nós temos aqui um exemplo, olha só, o do while, faça enquanto, perceba, faça o que está aqui dentro, enquanto esse teste for verdadeiro, ou seja, o que a gente tem aqui dentro, ele vai ser executado pelo menos uma vez; e em algumas situações isso é muito útil, porque a gente deseja executar um trecho de código uma vez para depois testar.
Vamos entender na prática então como seria essa diferença de um para o outro?
E para isso a gente vai usar
esse exemplo aqui, olha só, pedir ao usuário um número maior do que zero; então perceba, a exigência do meu problema aqui é que o número seja um ou maior do que um, tem que ser um número maior do que zero.
Vamos entender então como que a gente poderia resolver esse problema, garantir que o usuário vai digitar um número maior do que zero, utilizando tanto a estrutura while quanto a estrutura do while; vamos ver então como seria essa resolução.
Nós temos aqui a nossa primeira solução; nessa nossa primeira solução, perceba que eu estou utilizando um while, apenas while, enquanto teste for verdadeiro, faça isso aqui.
E aí lembrando que o nosso problema é pedir ao usuário um número maior do que zero.
Nesse caso, olha só, a estrutura while, ela primeiro testa para depois decidir se executa esse código ou não; como ela começa testando, eu preciso inicializar a minha variável num com um valor inválido, nesse caso, por exemplo zero; e aí então eu vou testar: zero é menor ou igual a zero?
Verdadeiro, e aí então eu vou pedir para o usuário digitar um valor maior do que zero.
Tem outra forma de resolver isso aqui?
Sim, nós temos outra forma de resolver isso aqui.
Perceba, nesse caso eu inicializei com zero a nossa variável num, por que eu inicializei com zero?
Porque eu quero que ele execute esse código ao menos uma vez, se eu inicializasse (...) ou, pior ainda, se eu não inicializasse e essa variável tivesse lixo de memória, esse teste poderia ser falso na primeira vez e ele não executaria isso aqui nenhuma vez.
Então tenha sempre em mente que a estrutura while primeiro testa para depois executar o código.
Vamos ver outra forma de resolver esse problema?
Olha só, ainda com a estrutura while, nós temos uma outra possibilidade: eu não quero inicializar a minha variável num com nenhum valor,por quê?
Eu estou pedindo para o usuário, ou eu vou pedir para o usuário digitar um valor maior do que zero, então não faz muito sentido inicializar a variável com algum valor.
Para garantir que o usuário vai digitar um valor, eu posso fazer isso aqui, olha só, perceba que eu estou pedindo para o usuário digitar um valor maior do que zero, mas nada me garante, ou ninguém me garante que ele de fato vai digitar um valor positivo, um valor maior do que zero.
Eu peço o valor uma vez e aí eu coloco a estrutura de repetição, olha só, ele vai digitar o valor e eu vou testar o valor que ele digitou, é menor ou igual a zero?
Se for verdadeiro, eu vou pedir novamente para ele digitar um valor maior do que zero; e agora nós temos a nossa repetição, assim que o valor foi lido, volta e testa esse valor novamente.
Perceba que nesse caso não foi necessário inicializar a nossa variável num, por quê?
Porque eu estou pedindo para o usuário digitar o valor antes da repetição.
O ponto negativo dessa solução é que eu repeti esse trecho de código; você percebeu o que eu tenho aqui nestas linhas é exatamente a mesma coisa que eu tenho aqui nessas linhas, mas em alguma situação pode ser útil fazer isso aqui.
Mas essa não é a única solução, vamos ver agora como seria este problema com o do while?
E aí com o do while, ele simplifica bastante a nossa vida; eu não preciso inicializar a variável num, porque no do while eu primeiro vou executar o que está aqui dentro para depois fazer o teste.
Então, eu simplesmente crio a minha variável, peço para o usuário digitar um valor maior do que zero, leio esse valor e aí então eu vou fazer o teste, num é menor ou igual a zero?
Enquanto isso aqui for verdadeiro, ele volta e faz o que está dentro do “do” novamente.
Nesse caso, perceba, será lido ao menos um valor para num antes do primeiro teste.
Então essas são as principais diferenças entre o while e do while.
Lembre sempre da estrutura, olha só, como que as duas são feitas; nós temos a primeira, que é owhile, temos um teste, e aí abrimos aqui um par de chaves, temos aqui o nosso trecho de código.
Se esse teste for falso na primeira vez, isso aqui não vai ser executado nenhuma vez.
Na estrutura do while já é um pouco diferente, olha só, do, faça o que estiver aqui dentro, e aí aqui nós colocamos o while com o nosso teste.
Então perceba que aqui, esse trecho de código ele vai ser executado pelo menos uma vez para depois fazer o nosso teste.