Est-il possible d'utiliser la fonction break
pour quitter plusieurs boucles for
imbriquées? Si oui, comment vous y prendriez-vous? Pouvez-vous également contrôler le nombre de boucles de sorties de pause?
Autant que je sache, C++ ne prend pas en charge les boucles de nommage, comme le font Java et d’autres langages. Vous pouvez utiliser un goto ou créer une valeur de drapeau que vous utilisez. À la fin de chaque boucle, vérifiez la valeur du drapeau. Si elle est définie sur true, vous pouvez sortir de cette itération.
Non, ne le gâtez pas avec un break
. C'est le dernier bastion restant pour l'utilisation de goto
.
Une autre approche pour rompre une boucle imbriquée consiste à factoriser les deux boucles dans une fonction distincte et à return
à partir de cette fonction lorsque vous souhaitez quitter.
Bien sûr, ceci soulève l'autre argument, à savoir si vous devriez ou non explicitement return
partir d'une fonction ailleurs qu'à la fin.
Juste pour ajouter une réponse explicite en utilisant lambdas:
for (int i = 0; i < n1; ++i) {
[&] {
for (int j = 0; j < n2; ++j) {
for (int k = 0; k < n3; ++k) {
return; // yay we're breaking out of 2 loops here
}
}
}();
}
Bien sûr, ce modèle a certaines limites et, bien évidemment, uniquement le C++ 11, mais je pense qu’il est très utile.
break ne sortira que de la boucle la plus interne qui la contient.
Vous pouvez utiliser goto pour sortir d'un nombre quelconque de boucles.
Bien sûr goto est souvent considéré comme nocif .
est-il approprié d'utiliser la fonction pause [...]?
Utiliser break et goto peut rendre plus difficile la raison de l'exactitude d'un programme. Voir ici pour une discussion à ce sujet: Dijkstra n’était pas fo .
Bien que cette réponse ait déjà été présentée, je pense qu’une bonne approche consiste à procéder comme suit:
for(unsigned int z = 0; z < z_max; z++)
{
bool gotoMainLoop = false;
for(unsigned int y = 0; y < y_max && !gotoMainLoop; y++)
{
for(unsigned int x = 0; x < x_max && !gotoMainLoop; x++)
{
//do your stuff
if(condition)
gotoMainLoop = true;
}
}
}
Que dis-tu de ça?
for(unsigned int i=0; i < 50; i++)
{
for(unsigned int j=0; j < 50; j++)
{
for(unsigned int k=0; k < 50; k++)
{
//Some statement
if (condition)
{
j=50;
k=50;
}
}
}
}
Un exemple de code utilisant goto
et une étiquette pour sortir d'une boucle imbriquée:
for (;;)
for (;;)
goto theEnd;
theEnd:
Un bon moyen de sortir de plusieurs boucles imbriquées est de refactoriser votre code en une fonction:
void foo()
{
for(unsigned int i=0; i < 50; i++)
{
for(unsigned int j=0; j < 50; j++)
{
for(unsigned int k=0; k < 50; k++)
{
// If condition is true
return;
}
}
}
}
goto peut être très utile pour casser des boucles imbriquées
for (i = 0; i < 1000; i++) {
for (j = 0; j < 1000; j++) {
for (k = 0; k < 1000; k++) {
for (l = 0; l < 1000; l++){
....
if (condition)
goto break_me_here;
....
}
}
}
}
break_me_here:
// Statements to be executed after code breaks at if condition
L'instruction
break
termine l'exécution de l'instructiondo
,for
,switch
ouwhile
la plus proche dans laquelle elle apparaît. Le contrôle passe à l'instruction qui suit l'instruction terminée.
de msdn .
Je pense qu'un goto
est valide dans ce cas:
Pour simuler une break
/continue
, vous souhaitez:
for ( ; ; ) {
for ( ; ; ) {
/*Code here*/
if (condition) {
goto theEnd;
}
}
}
theEnd:
for ( ; ; ) {
for ( ; ; ) {
/*Code here*/
if (condition) {
i++;
goto multiCont;
}
}
multiCont:
}
D'autres langages tels que PHP acceptent un paramètre pour break (c'est-à-dire break 2;) pour spécifier le nombre de niveaux de boucle imbriqués dont vous souhaitez sortir, mais pas C++. Vous devrez résoudre le problème en utilisant un booléen que vous avez défini sur false avant la boucle, sur true dans la boucle si vous souhaitez rompre, plus un saut conditionnel après la boucle imbriquée, en vérifiant si le booléen est défini sur true. et pause si oui.
Je sais que c'est vieux post. Mais je suggérerais une réponse un peu logique et plus simple.
for(unsigned int i=0; i < 50; i++)
{
for(unsigned int j=0; j < conditionj; j++)
{
for(unsigned int k=0; k< conditionk ; k++)
{
// If condition is true
j= conditionj;
break;
}
}
}
Casser n'importe quel nombre de boucles d'une seule variable bool
, voir ci-dessous:
bool check = true;
for (unsigned int i = 0; i < 50; i++)
{
for (unsigned int j = 0; j < 50; j++)
{
for (unsigned int k = 0; k < 50; k++)
{
//Some statement
if (condition)
{
check = false;
break;
}
}
if (!check)
{
break;
}
}
if (!check)
{
break;
}
}
Dans ce code, nous break;
toutes les boucles.