while em vez de do-while [RESOLVIDO]

1. while em vez de do-while [RESOLVIDO]

José
DeuRuimDotCom

(usa Linux Mint)

Enviado em 26/05/2019 - 12:34h

Sendo isso:

while(
comando 1,
...
comando n,
condição)

o mesmo que isso:

do{
comando 1;
...
comando n;
}while(condição);

por que usar um em vez do outro ou o outro em vez do um?


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 28/05/2019 - 14:50h

DeuRuimDotCom escreveu:

Sim, tem razão. O "if" teoricamente pode ser substituído por operadores lógicos e o "switch" também; o "goto" quase não se usa. "Return" e "break" darão legibilidade, mas, de novo teoricamente, caberia uma gambiarra que falseasse a condição e terminasse o laço etc.... Claro, teríamos um código infernal de escrever, ler etc... Haveria algo além disso? (Como se isso fosse pouco...)
]

A lista que eu escrevi de comandos que não podem aparecer entre parênteses não foi exaustiva (por exemplo, eu não incluí nenhum comando de laços de repetição), mas a regra geral é que você só pode ter dentro de parênteses o que for constituído apenas de expressões.

O C facilita construir como expressões algumas coisas que em outras linguagens não seriam possíveis, graças, principalmente, ao operador ternário (“a?b:c”), ao operador de sequenciamento (”a,b”, sendo que tanto a quanto b podem ter contexto void) e ao fato de que os operadores lógicos (&& e ||) funcionam em curto circuito (o segundo operando não é avaliado se o primeiro for suficiente para determinar o valor final da operação lógica).

Mas mesmo isso não é suficiente para cobrir tudo. No caso de if/else, todos os comandos dentro do dois blocos, executados quando a condição testada é verdadeira e quando ela é falsa, teriam de consistir apenas de expressões ou poder ser reduzidos a expressões; se apenas um deles não puder ser reduzido a uma expressão, então todo o bloco de torna irredutível, e inviabiliza a transformação do if em expressão.

O que, então, é ou não redutível a expressão?

Algumas coisas irredutíveis: desvios incondicionais (goto, break, continue e return) e também destinos desses desvios, declarações de variáveis, tipos e funções.

Coisas parcialmente ou condicionalmente redutíveis: condicionais, como if e switch, desde que todos os comandos sejam redutíveis (e, no caso do switch, que os diferentes casos de uso não tenham fall-through), laços de repetição (for, while, do/while) que possam ser reescritos na forma de funções recursivas (mas a definição dessa função não é redutível).

Mas mesmo que o código possa ser todo reescrito na forma de encadeamento de expressões, isso não significa que o código ficará tão legível ou eficiente quanto o código numa forma mais imperativa.


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)

3. Re: while em vez de do-while

Hugo Cerqueira
hrcerq

(usa Outra)

Enviado em 26/05/2019 - 21:37h

Bom, eu suponho que você esteja falando de C/C++, como sugere a categoria do tópico. Nesse caso, a sintaxe do while, que você colocou não é válida. A sintaxe correta seria:

while (condição)
{
comando1;
comando2;
//...
comandoN;
}


Ou então:

while (condição)
comando;


Segundo, a premissa de que os dois tipos de controle (while e do-while) fazem a mesma coisa é uma premissa falsa, porque há uma diferença fundamental:

O laço while avalia a condição antes da execução do(s) comando(s). O laço do-while avalia a condição depois da execução. Sendo assim, o laço do-while te dá a garantia de que o código será executado ao menos uma vez.

Então, o laço while poderia ser expresso como:

- Enquanto condição X for verdadeira, execute este(s) comando(s).

O laço do-while seria algo como:

- Repita a execução deste(s) comando(s) até que a condição X se torne falsa.

ERRATA: Não tinha percebido a princípio, mas acho que percebi o que você quis dizer. Usar múltiplas expressões dentro da condição do while, sendo a condição de fato a última delas, assim o efeito é similar ao de do-while, certo? Nesse caso, pode ser que em algumas situações o efeito seja o mesmo, mas no geral pode haver diferença, porque a execução dos comandos vai ocorrer uma vez mais no laço do-while. No mais, creio que o compilador pode dar um tratamento diferente aos dois casos quando aplicar otimizações.

---

Atenciosamente,
Hugo Cerqueira

Devuan - https://devuan.org/


4. Re: while em vez de do-while

José
DeuRuimDotCom

(usa Linux Mint)

Enviado em 26/05/2019 - 22:15h

hrcerq escreveu:

Bom, eu suponho que você esteja falando de C/C++, como sugere a categoria do tópico. Nesse caso, a sintaxe do while, que você colocou não é válida. A sintaxe correta seria:

while (condição)
{
comando1;
comando2;
//...
comandoN;
}


Ou então:

while (condição)
comando;


Segundo, a premissa de que os dois tipos de controle (while e do-while) fazem a mesma coisa é uma premissa falsa, porque há uma diferença fundamental:

O laço while avalia a condição antes da execução do(s) comando(s). O laço do-while avalia a condição depois da execução. Sendo assim, o laço do-while te dá a garantia de que o código será executado ao menos uma vez.

Então, o laço while poderia ser expresso como:

- Enquanto condição X for verdadeira, execute este(s) comando(s).

O laço do-while seria algo como:

- Repita a execução deste(s) comando(s) até que a condição X se torne falsa.

ERRATA: Não tinha percebido a princípio, mas acho que percebi o que você quis dizer. Usar múltiplas expressões dentro da condição do while, sendo a condição de fato a última delas, assim o efeito é similar ao de do-while, certo? Nesse caso, pode ser que em algumas situações o efeito seja o mesmo, mas no geral pode haver diferença, porque a execução dos comandos vai ocorrer uma vez mais no laço do-while. No mais, creio que o compilador pode dar um tratamento diferente aos dois casos quando aplicar otimizações.

---

Atenciosamente,
Hugo Cerqueira

Devuan - https://devuan.org/


Sim, você só entendeu o tópico na "ERRATA", mas creio que a culpa foi minha por não ter detalhado o ponto da questão.
De todo modo, pelos meus testes, ambos os esquemas fazem exatamente a mesma coisa. Gostaria de saber justamente isso que você cogitou, se há diferenciação em relação à compilação etc.




5. Re: while em vez de do-while

Paulo
paulo1205

(usa Ubuntu)

Enviado em 27/05/2019 - 08:49h

DeuRuimDotCom escreveu:

Sendo isso:

while(
comando 1,
...
comando n,
condição)

o mesmo que isso:

do{
comando 1;
...
comando n;
}while(condição);

por que usar um em vez do outro ou o outro em vez do um?


Porque dentro dos parênteses do while (ou de quaisquer parênteses) você só pode ter expressões; não pode ter um comando como if, switch, goto ou return.


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)


6. Re: while em vez de do-while

José
DeuRuimDotCom

(usa Linux Mint)

Enviado em 27/05/2019 - 15:39h

paulo1205 escreveu:
Porque dentro dos parênteses do while (ou de quaisquer parênteses) você só pode ter expressões; não pode ter um comando como if, switch, goto ou return.


Sim, tem razão. O "if" teoricamente pode ser substituído por operadores lógicos e o "switch" também; o "goto" quase não se usa. "Return" e "break" darão legibilidade, mas, de novo teoricamente, caberia uma gambiarra que falseasse a condição e terminasse o laço etc.... Claro, teríamos um código infernal de escrever, ler etc... Haveria algo além disso? (Como se isso fosse pouco...)





7. Re: while em vez de do-while [RESOLVIDO]

José
DeuRuimDotCom

(usa Linux Mint)

Enviado em 29/05/2019 - 12:50h

paulo1205 escreveu:
Coisas parcialmente ou condicionalmente redutíveis: (...) laços de repetição (for, while, do/while) que possam ser reescritos na forma de funções recursivas (mas a definição dessa função não é redutível).


Não sei se estou certo, mas poderia também excluir da redutibilidade os loops infinitos, quero dizer, laços em que a condição de parada não é dada de antemão, a depender, por ex., de entradas pelo usuário.

De todo modo, acho que sua resposta esgota o tema. O sr. deveria escrever um livro, suas reflexões aqui no VOL são bem mais profundas do que a maioria dos livros disponíveis, ao menos em português, sobre a linguagem C em específico e programação em geral.







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts