2010-06-09 8 views
7

Je n'ai jamais compris pourquoi utiliser un alors que est nécessaire. Je comprends ce qu'ils font, qui consiste à exécuter le code que contient la boucle while sans vérifier si la condition est vraie en premier.Pourquoi utiliser une boucle "do while"?

Mais est pas le code ci-dessous:

do{ 
    document.write("ok"); 
} 
while(x == "10"); 

exactement le même que:

document.write("ok"); 
while(x == "10"){ 
    document.write("ok"); 
} 

Peut-être que je suis être très stupide et manque quelque chose évidente sur mais je ne vois pas la avantage d'utiliser faire tandis que sur mon exemple ci-dessus.

+6

Dupe de http://stackoverflow.com/questions/994905/is-there-ever-a-need-for-a-do-while-loop – sharptooth

Répondre

14

Votre exemple de code est erroné:

do{ 
    document.write("ok"); 
}while(x == "10"){ 
    document.write("ok"); 
} 

Ce serait la forme réelle:

do { 
    document.write("ok"); 
} while(x == "10"); 

Vous avez raison qu'il exécute le bloc de code interne avant checkin g la condition, mais il n'a pas besoin de dupliquer le bloc de code interne comme vous l'avez. La construction do/while est (comme vous l'avez déjà dit) un moyen de s'assurer qu'un morceau de code est exécuté 1 fois ou plus au lieu de 0 ou plusieurs fois (selon le conditionnel).

+0

Je vois maintenant, je ne savais pas que ça vous sauve formulaire ayant à dupliquer le code interne. Merci pour l'aide. – Stanni

6

faire tout se déroulera au moins une fois - vous laisser faire, alors ... alors que tout exige la condition se sont réunis pour commencer du tout ..

var i = 6; 
do{ 
    alert(i); 
}while(i < 5) 

// alerts 6, but while criteria isn't met so it stops 

var i = 6; 
while(i < 5) { 
    alert(i); 
} 

// no output - while condition wasn't met 
2

La différence est plus importante lorsque vous avez plus d'une ligne de code à exécuter au moins une fois. Simuler une boucle do avec une boucle while entraînerait une duplication importante du code, ce qui est toujours mauvais. Certes, une meilleure solution consiste à refactoriser ce code dans une méthode et ensuite avoir simplement le même appel de méthode avant et dans la boucle, mais beaucoup de gens n'aiment même pas cette duplication, et l'utilisation du mot clé do déclare sans ambiguïté "ceci est un pied contrôlé boucle". Donc, fondamentalement, la lisibilité et les principes de base de SE.

1

Ce qui vous manque est que votre utilisation de do...while ci-dessus est 100% WRONG!

Une boucle do...while en Java, par exemple, ressemble à quelque chose comme ceci:

do { 
    //something you want to execute at least once 
} while (someBooleanCondition); 

Voir que l'absence totale d'un second bloc là-bas? Voir comment le whilese termine la déclaration complètement? Donc ce qui se passe maintenant est que le code dans la paire {...} entre do et while sera exécuté, puissomeBooleanCondition sera testé et si c'est vrai, le bloc de code sera exécuté à nouveau. Et encore. Et encore. Jusqu'à someBooleanCondition obtient testé faux.

Et à ce stade, peut-être, vous comprendrez pourquoi nous avons les deux formes de boucle.Le code ci-dessus pourrait être traduit:

//something you want to execute at least once 
while (someBooleanCondition) { 
    //something you want to execute at least once 
} 

Ce code, cependant, vous oblige à taper le même code (potentiellement important et complexe) deux fois, en laissant la porte ouverte pour plus d'erreurs. D'où la nécessité d'une boucle de test en bas au lieu d'une boucle de test en haut.

1

Tout d'abord, votre syntaxe do..while est incorrecte. Il est comme ceci:

do 
{ 
    document.write("ok"); 
}while(x=="10"); 

Il est utile lorsque vous voulez exécuter le corps de la boucle au moins une fois sans évaluer son état de teminating. Par exemple, disons que vous voulez écrire une boucle où vous demandez à l'utilisateur d'entrer et, selon l'entrée, exécutez du code. Vous voudriez que ceci s'exécute au moins une fois, puis demandez à l'utilisateur s'il veut continuer. Dans de tels cas, la boucle do..while entraîne un code plus petit et plus propre par rapport à une boucle while.

16
  • Comme vous le voyez-vous dû répéter la même ligne dans le second exemple. Lorsque vous gérez, vous voulez probablement que ces deux lignes soient les mêmes, mais s'est répété.

  • Imaginez maintenant que c'était un gros bloc et non une ligne, non seulement cela prendra-t visuelle précieux inutile espace, mais il sera également plus difficile à maintenir et d'attirer incohérences.

0

Son une meilleure façon d'écrire du code:

int count = ReadDataFromStream(); 
while(count != 0) 
{ 
    count = ReadDataFromStream(); 
} 

peuvent être écrites à l'aide do-while comme:

int count = 0; 
do 
{ 
    count = ReadDataFromStream(); 
} while(count != 0); 

Il y a de meilleurs exemples de do-temps, mais je ne pouvais pas rappel en ce moment.

2

Qu'en est-:

do{ 

    //..... 
    // 100000 lines of code! 
    //..... 

} while(i%10); 




Bien sûr, vous ne écrire que:

//..... 
// 100000 lines of code! 
//..... 

while(i%10){ 

    //..... 
    // 100000 lines of code! 
    //..... 

} 



Et vous serez alors obligé d'utiliser une boucle do-while
God Bless it !!

Edit:
Ou vous utiliserez les procédures ..

+0

Quelles sont les langues disponibles mais pas de procédures? –

+0

Vous pourriez probablement mettre les 100 000 lignes de code dans une fonction ... mais point pris. –

0

Bien que

do { 
    s1; 
    ... 
    sn; 
} while (p); 

pourrait être écrit comme

boolean done = false; 
while (!done) { 
    s1; 
    ... 
    sn; 
    done = !p; 
} 

le premier est plus compréhensible.

Questions connexes