en C ++ Modification de la variable de boucle à l'intérieur d'une boucle pour une boucle est autorisée:
const int value = computeValue(); //lots of code here
9 Réponses :
Il n'y a pas de construction logique pour l'appliquer. Si vous mettez «const int idx = i» comme première déclaration de la boucle, puis utilisez uniquement «IDX», vous pourrez peut-être obtenir une application similaire, mais à la perte d'une certaine clarté. Sinon, utilisez simplement des commentaires. p>
Vous pouvez essayer de changer votre nom de variable "boucle" en quelque chose de long et ridicule, de sorte que le toucher à l'intérieur de la boucle (plus d'une fois) va gratter l'œil. P>
aussi certains comme à l'aide de macros de boucle dédiés, tels que boost_foreach code>. Cela dissimule la variable / itérateur de boucle. P>
Je ne pense pas que cela soit possible pour une boucle fabriquée à la main, mais je suppose que cela pourrait être considéré comme un argument supplémentaire pour encourager l'utilisation de std :: for_ach et edit forte> ... et le c ++ 0x basé sur la boucle de plage (merci Matthieu. m :) p>
S'il souhaite garantir la non-modification du compteur de boucle dans le corps de la boucle, alors pour l'amour de Dieu juste faire cela i>. J'ai montré une voie dans ma réponse, il y en a d'autres. Mais ne faites pas cette chose rubé Goldberg qui n'atteint même pas le but.
@Alf: Évidemment, comme indiqué par la "solution stupide" des étiquettes de ma réponse, je ne recommanderais jamais rien de tel dans le code "réel"
@Cécrime: Désolé, je n'ai tout simplement pas eu la blague. Esprit très lent aujourd'hui. Désolé.
@icecrime: Ajouter dans la nouvelle construction basée sur la plage FR. wikipedia.org/wiki/c%2b%2b0x#range-based_for-loop
C'est une excellente question et m'a fait penser à la façon dont vous pourriez faire cela et les moyens. Sans dépenser trop de temps, la seule chose que j'ai proposée était la suivante: évidemment, l'utilisateur pourrait toujours modifier la garde dans la boucle, mais peut-être l'intention au sommet montre que cela va être vérifié. p> p>
Techniquement, vous pouvez le faire, par exemple,
int main() { for( int i = 0; i < 42; ++i ) {{ typedef void i; i = 666; // !Nope. }} }
Vous pouvez rendre l'ensemble du corps de la boucle à boucle une fonction distincte, pour laquelle la variable de contrôle de la boucle est hors de portée. p>
Je ne peux pas penser à un moyen simple de faire ce que vous voulez car la variable de contrôle de la boucle est la définition de la définition mutable, afin de contrôler la boucle. P>
C ++ 0x amusant. Ce code n'est pas compilé: erreur:
'I': une capture par valeur ne peut pas être modifiée dans une Lambda non mutable p> p>
Utilisez pour_acher combiné avec Boost :: compter_iterator a> et une fonction qui accepte un const int.
Je pense que avec C ++ 0X, vous pouvez faire ce Typedef Boost :: compter_iterator
Créer un objet étrange avec une macro qui prend Je ne l'ai pas testé. Juste une idée. P> p>
Je crois que
std :: for_ach code> pourrait faire cela.
J'ai utilisé
boost_foreach code> avec beaucoup de succès. Vous pouvez même introduire une commodité
#define foreach boost_foreach code> dans votre en-tête précompilé.