Bonjour,
J'aurai aimer connaitre la différence entre l'utilisation de for( ; ; ) par rapport a while(true) (ou while(1) selon les langages)
Un grand merci
Martin MAGAKIAN
Version imprimable
Bonjour,
J'aurai aimer connaitre la différence entre l'utilisation de for( ; ; ) par rapport a while(true) (ou while(1) selon les langages)
Un grand merci
Martin MAGAKIAN
Dans mes programmes, si j'ai besoin d'une boucle "principale", j'utiliserai :
Maintenant, si c'est pour un décompte (5,4,3,2,1,0->BOUM)Code:
1
2
3
4
5
6
7
8 int ma_var = 1; do { /* code */ } while(ma_var)
Code:
1
2
3
4
5
6 int i = 5; for (i;i>=0;i--) { /* code */ }
ça n'est pas la question que pose le PO...
En fait les 2 formes sont identiques.
Et aucune n'et plus "mieux" que l'autre... :mrgreen:
For est une boucle dont les contours sont déterminés à l'avance. While dépend de conditions internes.
Evidemment, ont peut tout faire avec chacune, mais quand tu connais par avance l'ensemble de ce que tu vas traiter(par exemple un tableau dont tu as la taille) For sera plus lisible. Si au contraire la sortie n'est pas anticipable(tu scannes un tableau jusqu'à la première ligne vide), alors While est bien plus efficace.
mais après, c'est aussi une question d'habitude. Mon père ne mets que des For, quitte à tourner parfois dans le vide, parcequ'il considère que c'est plus lisible. Moi je préfère While, parceque j'ai une meilleure maitrise de mes conditions de sortie.....
ne raconte pas n'importe quoi stp....
Les 2 exemples que le PO donne sont pour des boucles INFINIES.
Et dans ce cas, voir mon post plus haut....
OK merci des réponses :-)
Donc d'après toi "souviron34" au niveau du compilateur c'est la même chose et aucun n'est plus "optimisé" ?
non je ne crois pas..
Le compilateur est assez "intelligent" pour voir qu'il a affaire à une boucle infinie, et par conséquent la code comme il l'entend (qui sera sans doute lamême dans les 2 cas..). Je n'ai pas le temps de sortir le résultat en ASM, mais je suis quais-sûr qu'on verrait le même code avec les 2 manières..
Bonjour,
Les deux exemples sont effectivement identiques, dans les deux cas il s'agit d'une boucle infini, mais si je devais en choisir un, personnellement j'opterai pour while(1) mais c'est uniquement parce que je trouve que ca passe mieux a l'oeil.
Comme l'a dis souviron34 les deux fonctionnent, aprés chacun a sa préférence ;).
Je n'aime pas ce genre de déclaration et je la déconseillerais.
Je n'aime pas du tout while(1) parce que c'est synonyme de plantages et d'application logicielle qui n'est pas intégre...
Je sais qu'évidemment dans un while(1) on met une séquence d'échappement, un break mais je ne suis pas trop fana de cela
petit exemple: va faire un chenillard sur une petite carte a pickit sans faire de boucle infini....
encore une fois nous sommes dans forum général et non pas spécifique a un language... quand j'ai commencé la prog sur pic (en assembleur au début puis en BASCOM, tous nos prog étais inclus dans une boucle infini.
Contrairement à mes estimés collègues, je ne vois pas bien en quoi une boucle infinie est révoltante... Il y a un tas de programme qui sont faits pour tourner éternellement sauf condition de sortie exceptionnelle, comme les serveurs, les services de l'OS, etc.
Ensuite comme l'a dit Souviron les deux formes sont équivalentes, for(;;) attire peut-être un peu plus l'œil, rendant évident le fait qu'il s'agit d'une boucle infinie, raison pour laquelle je l'utilise de préférence (mais c'est très subjectif).
--
Jedaï
Ouais on peut toujours, et parfois il faut torturer l'ensemble de la structure de ton programme pour te permettre de passer par le while juste après l'endroit où tu voudrait sortir de la boucle, et parfois tu as dix-huit point de sortie et ton while devient un gruyère ou tu te retrouve à créer des variables artificielles pour indiquer qu'il faut arrêter la boucle.
Il arrive qu'un break bien placé soit mille fois plus lisible qu'une boucle torturé pour ne s'arrêter que sur son test.
Les boucles infinies ou les instructions de contrôle de boucle ne doivent pas devenir le cas général, mais il y a bien des occasions ou elles sont la meilleure solution. Gardons nous de tout dogmatisme.
--
Jedaï
Je veux bien mais c'est prendre certaines extrêmités; un chenillard c'est un chenillard et c'est sa seule fonction je regrette.
Un programme informatique c'est sensé effectuer plusieurs actions différentes, sauvegarder lire des données...bref il faut que l'utilisateur puisse interagir avec.
Imagines-tu dans un logiciel de compta ou bancaire mettre une boucle infinie ?
@Garulfo et Mat.M :
- TOUS les gestionnaires de fenêtres (ce qui est sous-tendu par X11, par VC++, par wxwidgets etc etc) ont un while(1).. (MainLoop)
- TOUS les langages de commandes (shell ou autres, ou les programmes équivalents attendant une entrée de l'utilisateur [ftp par exemple]) ont un while(1)
- Quel est le code interne de select ??
- Comment fait-on une appli tournant 24/7/365 ??
:P
et j'en passe et des meilleurs ;)
Mais ce sont des erreurs.
Toutes ces applications attendent qu'on les brise et capture le signal au besoin.
C'est absurde. Il est aisé en plus de corrigé ça:
Ce qui n'empêche pas de capturer le signal. C'est de la fainéantise. Et la fainéantise ne porte jamais fruit dans ce genre de cadre.Code:
1
2
3
4
5
6 continuer = true; while(continuer) { ... avec les éléments transformant continuer en faux. }
Montre moi un seul code qui utilise un while(1) que je ne pourrais aisément (très aisément) rendre propre !
mais ça n'attend aucun signal !!!
tu n'en sorts JAMAIS..Code:
1
2
3
4
5
6
7
8
9
10 XtMainLoop ( void ) { while ( 1 ) { if ( XGetNextEvent(..&event) ) { XDispatchEvent(event); } } }
Tu peux si tu veux enregistrer une callback EXit sur le fait d'appuyer sur la croix en haut à droite ou gauche de la fenêtre, qui elle fera un exit..
Mais dans cette boucle de fond, c'est juste ça que ça fait ..
et ton main est juste :
Code:
1
2
3
4
5
6
7
8
9
10
11 int main ( void ) { ..... ....... XtMainLoop(); return EXIT_SUCCESS ; }
Et bien sûr toute les endroits où l'on peut sortir de la boucle sont à la fin de la boucle (du point de vue de l'exécution) ? "continuer" est une variable arbitraire qui peut correspondre à une dizaine de conditions différentes, je ne vois pas en quoi mettre "continuer = false" au lieu de "break" est meilleur pour la lisibilité du programme, au contraire !!
--
Jedaï