CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Différence entre while et for...

Encastrement
Encastrement
Niveau 6
23 août 2012 à 09:45:37

Salut,

Je suis à la fac de Physique et je suis souvent amené à coder en c++, mais je n'ai aucune réelles bases dans ce domaine. Ca fait longtemps que, par exemple, lorsque je veux initialiser toutes les coordonnées d'un tableau à 0(disons tab[100] ), j'utilise une boucle for pour i allant de 0 à 99 avec incrément de 1, et je donne l'ordre tab[i]=0;

Cependant, je peux tout aussi bien utiliser :

short int i=0;
while(i<100)
{
tab[i]=0;
}

L'effet est le même, n'est-ce pas?
En fait, ma question est plus générale. Dans quel cas une boucle for s'IMPOSE-t-elle ? J'ai l'impression qu'on peut tout le temps lui substituer une boucle while adéquate. Est-ce une question d'optimisation ? le programme, pour deux effets équivalents, est-il plus rapide avec la boucle for?
De plus, pour stopper une boucle while, un break suffit si je ne me trompe pas ? (Bien que mon prof m'ait fortement déconseillé d'utiliser break, et m'ai dit de m'en passer autant que possible : POURQUOI, d'ailleurs? ) Tandis que pour sortir d'une boucle for, je ne connais pas d'autre solution que de mettre l'indice plus haut que la valeur dernière de la boucle.

Dernière question. J'ai une fonction surchargée qui écrit du texte. Une version prend une variable string, l'autre un double.

void texte(std::string val);
void texte(double val);

À présent, j'ai une autre fonction, trèèèès longue, qui s'appelle fonctionTresLongue(std::string coucou);

Cette fonction, à un moment, fait appelle à texte(coucou).
J'aimerais aussi surcharger cette fonction : fonctionTresLongue(double coucou), de manière à pouvoir donner en argument à fonctionTresLongue un string comme un double.

Ma question : y'a-t-il plus élégant pour ce faire que de copier coller ma trèèès longue fonction, juste pour changer "std::string coucou" par "double coucou" dans ses arguments? C'est la seule et unique chose qui change, puisque l'appel à la fonction texte() dans la fonction très longue comporte toujours l'argument coucou, qu'il soit un string ou un double.

Merci de votre aide !

chris_27
chris_27
Niveau 10
23 août 2012 à 10:08:08

Bonjour,

Je commencerais par l'éternel :
« faire une boucle, c'est écrire 3 choses (en plus du corps de la boucle) :
1) initialiser une variable (indice de boucle)
2) mettre un test pour savoir si on continue ou arrête la boucle
3) mettre à jour la variable
»

À partir de là, que tu fasses des while ou des for en C++, ça ne change rien à part l'endroit où tu mets ces trois choses. :oui:

Cela étant dit, je préfère les for car :
:d) de part la syntaxe, ça t'évite d'oublier l'une des trois choses (typiquement le 3) qu'on zape trop souvent avec un while)
:d) en C++, l'indice de boucle peut être déclaré (sans surplus de code) dans le for pour avoir une portée limitée au corps de boucle, ce qui est nettement plus propre.
:d) le C++ regorge de structures de données fournissant des itérateurs pour lesquels tout regrouper dans le for permet de rendre le code plus clair/compréhensible.

« J'ai l'impression qu'on peut tout le temps lui substituer une boucle while adéquate. » :d) ça c'est vrai. L'inverse (changer un while en for) est vrai en C++, faux dans d'autres langages.

« Est-ce une question d'optimisation ? » :d) à ton niveau (mais ça concerne la majorité des gens ici), cette question ne se pose pas. La micro-optimisation, tu es 1000 ans trop jeune pour la faire mieux que ton compilateur (surtout si tu utilises l'option -O2 comme il se doit, en supposant que c'est bien un gcc-like qui compile).

En prime, ici, le code assembleur généré est (sauf cas tordus) parfaitement équivalent que tu mettes for ou while. Au final, tu finis avec des jump (le goto de l'assembleur).

Conséquence direct, il n'y a pas de différence dans la rapidité d'exécution. :-)

« Bien que mon prof m'ait fortement déconseillé d'utiliser break » :d) bah c'est un con. </manque de diplomacie>
Le break (tout comme le continue pour sauter à l'itération suivante), c'est super utile à condition de l'utiliser à bon escient.

« Tandis que pour sortir d'une boucle for, je ne connais pas d'autre solution que de mettre l'indice plus haut que la valeur dernière de la boucle. » :d) break. Il n'y a pas de raisons pour que ça soit différent. :-)))

« y'a-t-il plus élégant pour ce faire que de copier coller ma trèèès longue fonction, » :d) éventuellement, un template (mais ça t'embarque loin si tu n'as jamais vu ça, et il faut voir le code pour savoir si c'est applicable).

Une autre solution serait de convertir ton double en string (par exemple en passant par un istreamstring) puis d'appeler la variante qui prend en entrée un string. C'est cinq ligne de code, et ça marchera très bien (modulo la légère perte de précision lors de la conversion, dont je suppose qu'elle n'aura pas d'impact dans ton cas).

Pour finir, une question de ma part :
pourquoi "void texte(std::string val);" et non "void texte(const std::string& val);" qui est plus rapide et probablement plus propre ? Tu modifies vraiment ta chaîne dans ta fonction ?

Encastrement
Encastrement
Niveau 6
23 août 2012 à 11:33:16

Tout d'abord merci, tu m'as apporté quelque chose de rare sur les forums : une réponse précise et claire à toutes mes questions ! :ouch:

"pourquoi "void texte(std::string val);" et non "void texte(const std::string& val);" qui est plus rapide et probablement plus propre ? Tu modifies vraiment ta chaîne dans ta fonction ? "
==> parce que je n'y ai pas pensé^^ La fonction texte ne modifie pas la chaine de caractères, en effet. (Peut-être que j'aurais fini par le faire quand j'utilisirai la fonction texte plus massivement).

Paulop
Paulop
Niveau 12
23 août 2012 à 11:38:20

Dans le doute, passe toujours ta chaine en const std::string& val, sauf si tu es sur de la modifier.
Et quand je dis que tu es sûr, c'est que tu vas écrire immédiatement la transformation de la chaine, pas que tu penses le faire un jour.

chris_27
chris_27
Niveau 10
23 août 2012 à 12:36:44

Je plussoie Paulop. Il vaut mieux avoir trop de const que pas assez. :oui:

Enlever un const parce que le code évolue et qu'il faut modifier un argument, c'est trivial. Remettre des const quand ils n'ont pas été mis, ça se compte en heures (voire en journées sur les projets un peu gros et pas très bien codés) de travail. :(

stargamer2
stargamer2
Niveau 9
24 août 2012 à 15:33:09

Sinon je reviens à l'origine de ta question, la différence fondamental entre un for et un while c'est la quantification du nombre d'itération.
En général, on utilise un for quand on sait exactement combien d'itération on veut avoir alors qu'un while peut permettre une itération sans vraiment savoir exactement quand ça s’arrêtera.

Par exemple
while(pointDeVie > 0) {
pointDeVie=jouer() ;
}

avec la fonction jouer qui retourne les points de vie restant en fonction de tes actions par exemple.

Pseudo supprimé
Pseudo supprimé 24 août 2012 à 16:27:05

@stargamer2

po besoin de while

http://ideone.com/Svp9Q

chris_27
chris_27
Niveau 10
24 août 2012 à 16:40:56

« Sinon je reviens à l'origine de ta question, la différence fondamental entre un for et un while c'est la quantification du nombre d'itération. » :d) c'est vrai dans les langages où la syntaxe t'impose que la mise à jour (point 3) soit une incrémentation/décrémentation de pas constant, et que le test (point 2) soit une comparaison directe à l'indice de boucle. Ce n'est pas du tout le cas en C ou en C++, et du coup on y voit des boucles for très exotiques. :)

Au passage, certains préfèrent « for(;;) » à « while(true) » pour les boucles infinies en C ou C++.

KouicKouic
KouicKouic
Niveau 6
24 août 2012 à 21:49:50

Pour ce qui est de déconseiller break dans les boucle, je dirais que c'est pour forcer à organiser au mieux le code dans la boucle et éviter de voir apparaître des tests + break dispersés dans la boucle. Ce qui diminue la lisibilité. Comme les goto de façon générale.
Ce n'est pas un professeur con, c'est un professeur qui incite ses élèves a mieux structurer.

Sous forums
  • Aide à l'achat Mac
  • Steam Deck
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Macintosh
  • Hardware
La vidéo du moment