48 votes

Comment écrire une boucle `for` sur les valeurs booléennes (false et true)

Une question surtout pour le plaisir et la curiosité: comment écrire un for boucle en C++, qui itérer sur deux valeurs de a, bool (c - true et false), en utilisant uniquement des opérations avec l' bool (c'est à dire sans les conversions à d'autres types)?

L'arrière-plan, c'est que je voulais vérifier combien de solutions existe pour une équation comme (A && B) || (!B && !C && !D) == true, et a commencé à écrire quelque chose comme for (bool A=false; ??? ; ++A) for (bool B=false; ...) etc mais immédiatement coincé par ??? - c'est à dire ce qui serait la condition pour continuer la boucle? Bien sûr, je l'ai réécrit pour utiliser des int, et je sais aussi qu'un do ... while boucle de travail, mais je suis curieux de savoir si il est toujours possible d'écrire un tel for boucle? Et comme tout ne semble pas avoir une réponse, j'ai décidé de demander :)


Mise à jour: notez qu'une "évidence", variante for(bool A=false; !A; A=true) proposé dans au moins deux maintenant-réponses supprimées ne fonctionnera qu'une seule itération, parce que pour le second, la condition d' !A devient false et la boucle se termine.

Après quelque réflexion, je crois qu'il est impossible de le faire en C++03, sans une seconde variable ou un pointeur de base de construction comme suggéré par Dietmar Kühl. La condition doit être testé à trois reprises d'exécution souhaitée, de sorte que deux valeurs d'un bool sont tout simplement pas assez. Et pour la boucle while fonctionne parce que la première itération est exécutée sans condition, la condition est vérifiée uniquement deux fois et donc une valeur booléenne peut être utilisé pour choisir entre la poursuite et la sortie.

60voto

Kerrek SB Points 194696

En C ++11: for (bool b : { false, true }) { /* ... */ }


Voici une version C ++03:

 for (bool a = true, b = false; b != a; a = a && b, b = !b) { /*...*/ }
 

(Utilisez soit a ou b .)

7voto

Dietmar Kühl Points 70604

Lorsqu'il est limité à C ++ 2003, vous pouvez utiliser une approche à peu près équivalente à l'approche C ++ 2011;

 {
  bool const bools[] = { false, true };
  for (bool const* it(bools); it != bools + 2; ++it) {
      bool a(*it);
      use(a);
  }
}
 

Peut-être emballé dans une macro.

4voto

mdk Points 1
 a = true;
do {
  use(a);
  a = !a;
} while (!a);
 

OK, ce n'est donc pas une boucle for , mais je dirais qu'elle est plus lisible que n'importe quelle suggestion de boucle for (autre que l'approche C ++ 11, bien sûr.)

2voto

Aotium Points 26

Un de plus pour C ++03:

 for(bool a = false, b = true; b; a = !a, b = a)  
 

Utilisez b.

1voto

jrok Points 30472

Celui-ci fonctionne aussi:

 for (bool a = false, b = false; a == b; b = !b, a = a || b) { }
 

(sorte de solution inversée que celle de @ KerrekSB)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X