La différence entre for et while ?

Signaler
Messages postés
157
Date d'inscription
jeudi 17 octobre 2002
Statut
Membre
Dernière intervention
11 septembre 2004
-
Messages postés
64
Date d'inscription
dimanche 9 février 2003
Statut
Membre
Dernière intervention
7 mars 2003
-
J'aimerais savoir la différence entre les boucles for et while,
leurs avantages, leurs inconvénients...
Merci
Krox68

2 réponses

Messages postés
260
Date d'inscription
lundi 27 janvier 2003
Statut
Membre
Dernière intervention
27 août 2008
1
Salut,

Il y a quelque temps, je me posait la meme question que toi, voici une réponse que l'on m'a renvoyé :

De mémoire, du temps ou l'optimisation était un coucours permament de potache le while est plus
rapide, si et seulement si tu décrément en dernier instruction.

Le plus lent

for (int i=0; i<50; i++)
{
}

Vitesse moyenne
int i=50;
do
{
i--;
}
while (i!=0)

Le plus rapide
int i=50;
while (i)
{
.. code ..
i--;
}

Mais bon, c'est sur des compilateurs de 1990, depuis le temps les optimisations ont certainement
évolué.
Le mieux est de comparer le code assembleur générer.

; 9 : int total=0;
00005 33 c0 xor eax, eax
$L9625:

; 10 : while(i)
; 11 : {
; 12 : total+=i;

00007 03 c1 add eax, ecx

; 13 : i--;

00009 49 dec ecx
0000a 75 fb jne SHORT $L9625

; 14 : }

Le while est normal

; 17 : int total2=0;
0001a 33 c9 xor ecx, ecx
; 18 : for (int i2=50;i2;i2--)
0001c b8 32 00 00 00 mov eax, 50 ; 00000032H
$L9630:
; 19 : total2+=i2;
00021 03 c8 add ecx, eax
00023 48 dec eax
00024 75 fb jne SHORT $L9630

Et bien le for génére le même code.
Les optimisateurs font bien leur travail.
Par contre si tu fais une boucle
for (int i2=0;i2<50;i2++) tu vas moins vite

Bon amusement,
Rémi
Messages postés
64
Date d'inscription
dimanche 9 février 2003
Statut
Membre
Dernière intervention
7 mars 2003

> J'aimerais savoir la différence entre les boucles for et while,
> leurs avantages, leurs inconvénients...

Les différences ne sont pas au niveau de la vitesse, mais plutôt de l'efficacité et de la simplicité. Comparons :

int i = 0;
while (i < 10 )
{
std::cout << "êêêêllo";
++i;
}

for (int j = 0; j<10; ++j)
{
std::cout << "êêêêllo";
}

Le for est définitivement plus clair et plus concis. Plus efficace? Pas du côté de la vitesse, mais un peu du côté 'organisation'. Dans le for, la variable 'j' est locale à la boucle, c'est-à-dire qu'elle n'existe qu'entre les deux accolades, contrairement au while.

Mais à part ça, on peut habituellement faire la même chose avec les deux, mais de façon différente. Lequel choisir dépend du contexte et de ce que tu veux faire. Pour une simple variable compteur, tu préféreras le for au while (comme on a vu). Pour une boucle sans fin, le while(true) à la place de for(;;). Pour une condition simple, le while(condition) au for(;condition), et ainsi de suite.

Mais souviens toi, il n'y a, en général, pas de différence de vitesse entre les deux.

D'après moi, même, il n'y en a aucune, car les optimiseurs font du très bon travail, mais je garde le 'en général' comme porte de sortie :)