En C il y a une boucle while do et pascal (presque) équivalente est la boucle repeat until, mais il y a une petite différence entre les deux, alors que les deux structures va itérer au moins une fois et vérifier s'ils ont besoin de faire la boucle seulement à la fin, en pascal vous écrivez la condition que vous devez rencontrer pour terminer la boucle (REPEAT UNTIL quelque chose) en C vous écrivez la condition qui doit être remplie continuer la boucle (faire quelque chose). Y at-il une raison pour laquelle il y a une différence ou est-ce simplement une décision arbitraire?La répétition de Pascal ... jusqu'à ce que C soit fait ... tandis que
Répondre
J'ai toujours trouvé des boucles UNTIL vers l'arrière, mais c'est peut-être parce que je viens d'un arrière-plan C. Il y a des langages modernes comme Perl qui fournissent les deux, mais il n'y a pas d'avantage particulier pour l'un par rapport à l'autre
Personnellement, je pense aussi que la version C a plus de sens, et je viens d'un fond pascal, donc je me suis retrouvé à écrire une mauvaise condition en C une fois que j'ai commencé à étudier C. – Bob
Je ne suis pas sûr des influences historiques, mais à mon avis C est plus cohérent, en ce sens que if
s exige qu'une condition soit true pour que le code s'exécute, tout comme while
s et do while
s.
et 'for' , d'ailleurs. – caf
Il n'y a aucune différence fondamentale, et aucun avantage par rapport à l'autre. C'est juste du "sucre syntaxique" - un changement de la syntaxe du langage qui ne change pas son comportement de façon réelle. Certaines personnes trouvent «répéter jusqu'à» plus facile à conceptualiser, tandis que d'autres trouvent «répéter tout en» plus facile.
Si, en C, vous rencontrez une situation où « jusqu'à ce que » est ce qui est le désir, vous pouvez toujours niez simplement la condition:
do {
excitingThings();
} while (!endOfTheWorld());
Il est juste une décision arbitraire. Certaines langues ont les deux. L'instruction QBASIC/VB DO...LOOP prend en charge les quatre combinaisons de prétest/posttest et WHILE/UNTIL.
Il n'y avait pas de "décision" qui relierait le comportement de Pascal repeat/until avec le comportement de C do/while, ni délibéré ni arbitraire. Ce sont simplement deux problèmes complètement indépendants. boucle
En C la déclaration
while(some_condition);
pourrait être soit un « ne rien faire » ou aurait pu se détacher d'une boucle « do ... while ».
do {
statement;
statement;
statement;
lots more statements;
}
while(some_condition);
L'utilisation d'un mot clé différent - jusqu'à - évite cette mauvaise interprétation possible.
Pas un tel problème ces jours où tout le monde allume tous les avertissements du compilateur et les prend en compte, n'est-ce pas? Pourtant, je soupçonne que la plupart des programmeurs chevronnés C ont souhaité - à un moment ou à un autre - que C utilisé "jusqu'à" dans ce cas.
J'utilise 'while (cond) continue;' pour faire comprendre que le corps de la boucle est vide. –
@Loadmaster - bonne idée - je pourrais adopter celui-là pour mon propre code. – Dipstick
@ChrisHarris: Oui, une instruction vide (un point-virgule nu) pour un corps de boucle est un bug qui n'attend que de se produire. Mauvais style de code. –
La syntaxe C ne nécessite aucun mot-clé supplémentaire.
En C, les deux mots clés do
et while
fonctionnent pour deux types de boucles. Pascal nécessite quatre mots-clés: while
, do
, repeat
, et until
.
Vous auriez besoin d'un seul mot-clé de plus. 'while' pour la condition préalable, soit' repeat' ou 'do' et' until' pour la postcondition –
D'autre part, C recycle les mots-clés, ce qui peut entraîner de la confusion. Voir le message de ChrisHarris –
La conception de Pascal a été motivée en partie par le travail de programmation structurée des années 1960, y compris le travail révolutionnaire d'Edsger Dijkstra A Discipline of Programming. Dijkstra (le même homme qui a considéré goto
nocif) a inventé des méthodes pour créer des programmes qui étaient corrects par construction.Ces méthodes, y compris les méthodes d'écriture des boucles qui se concentrent sur le postcondition établi lorsque la boucle se termine. En créant le formulaire repeat... until
, Wirth s'est inspiré de Dijkstra pour rendre explicite la condition de terminaison, plutôt que son complément, dans le code. J'ai toujours admiré des langages comme Smalltalk et Icon, qui offrent deux formes syntaxiques, permettant ainsi au programmeur d'exprimer clairement son intention, sans nécessairement avoir à compter sur un opérateur complémentaire facilement manqué. (Dans Icon, les formes sont while e1 do e2
et until e1 do e2
; dans Smalltalk, elles sont block1 whileTrue: block2
et block1 whileFalse: block2
.) De mon point de vue, ni C ni Pascal ne sont entièrement conçus, orthogonaux.
Donc, prenons perl, il a même la complémentarité de 'if' qui est' unless' et vous pouvez les placer avant ou après l'instruction. Mais l'orthogonalité de Perl n'est pas vraiment un avantage. –
+1, en fournissant les deux formes dans le langage permet un code plus lisible. – Artelius
Voici quelques pièces de rechange à copier-coller dans votre code: !!!!!!!!!!!! –
Hellfreezeover: = false; REPEAT JUSQU'A Hellfreezeover –