« Programmation C++/Les structures de contrôles » : différence entre les versions

Contenu supprimé Contenu ajouté
→‎Le break : <code>break parcimonie;</code>
Ligne 523 :
 
=== Note importante ===
LeL'instruction <code>break</code> rendinterrompt le codecours difficilenormal à lire, àde l'exceptionexécution de son utilisation dans un <code>switch</code>, il neet doit pas être utiliséutilisée (auavec même titre que le <code>goto</code>)parcimonie.
Elle ne doit servir que pour éviter une complexification de la condition ; une condition complexe pouvant entraîner des erreurs de code et une moindre lisibilité.
 
L'exemple ci-dessous montre un cas où il n'est pas pertinent d'utiliser l'instruction <code>break</code>.
<syntaxhighlight lang="cpp" highlight="4">
for (int i=0 ; i<10 ; i++)
{
cout << "La variable i vaut : " << i << endl;
if (i == 5) break;
}
</syntaxhighlight>
 
L'arrêt par l'instruction est notamment non pertinent dans ce cas car l'arrêt est prévisible à l'avance.
Il suffit pour cet exemple de corriger la condition d'arrêt de la boucle :
<syntaxhighlight lang="cpp">
for (int i=0 ; i<=5 ; i++)
{
cout << "La variable i vaut : " << i << endl;
}
</syntaxhighlight>
 
Par contre, dans le cas de l'exemple suivant, où un arrêt prématuré de la boucle est effectué lorsqu'un item de tableau est trouvé et qu'un traitement complexe détermine qu'il faut interrompre la boucle, l'utilisation de l'instruction <code>break</code> est pertinent.
L'équivalent avec une condition de boucle serait complexe, ou nécessiterait l'utilisation d'une variable dédiée au stockage de la condition.
<syntaxhighlight lang="cpp" highlight="10">
for (int i=0 ; i<10 ; i++)
{
cout << "ITEM " << i << endl;
if (item[i]->getType() == type_a_trouver)
{
cout << " Trouvé à l'index " << i << endl;
if (item[i]->analyseContenuFichier() == TYPE_WIKICODE)
{
cout << " Page wiki trouvée." << endl;
break;
}
cout << " Fausse alerte, on continue..." << endl;
}
cout << " Item suivant !" << endl;
}
</syntaxhighlight>
 
L'équivalent avec une variable stockant l'état de la condition de sortie impliquerait de tester cet état dans la condition de boucle, déterminer une valeur initiale pertinente pour que la boucle fasse la première itération, de tester cet état aussi avant chaque instruction ou bloc à chaque niveau d'accolade.
Cela produit un code beaucoup moins explicite, et réduit la maintenabilité du code (répétition de code) :
<syntaxhighlight lang="cpp">
int trouve = 0;
for (int i=0 ; i<10 && trouve==0 ; i++)
{
cout << "ITEM " << i << endl;
if (item[i]->getType() == type_a_trouver)
{
cout << " Trouvé à l'index " << i << endl;
if (item[i]->analyseContenuFichier() == TYPE_WIKICODE)
{
cout << " Page wiki trouvée." << endl;
trouve = 1;
}
if (trouve == 0)
cout << " Fausse alerte, on continue..." << endl;
}
if (trouve == 0)
cout << " Item suivant !" << endl;
}
</syntaxhighlight>
 
== Le continue ==