9
votes

Comment montrer qu'une variable de contrôle de boucle n'est pas modifiée à l'intérieur du corps de la boucle C ++?

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


2 commentaires

Je crois que std :: for_ach pourrait faire cela.


J'ai utilisé boost_foreach avec beaucoup de succès. Vous pouvez même introduire une commodité #define foreach boost_foreach dans votre en-tête précompilé.


9 Réponses :


1
votes

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.


0 commentaires

0
votes

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.

aussi certains comme à l'aide de macros de boucle dédiés, tels que boost_foreach . Cela dissimule la variable / itérateur de boucle.


0 commentaires

4
votes

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 boost_foreach pour itérations sur le conteneur STL.

edit ... et le c ++ 0x basé sur la boucle de plage (merci Matthieu. m :)


4 commentaires

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 . 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



2
votes

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: xxx

é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é.


0 commentaires

1
votes

Techniquement, vous pouvez le faire, par exemple,

int main()
{
    for( int i = 0;  i < 42;  ++i )
    {{
        typedef void    i;

        i = 666;        // !Nope.
    }}
}


0 commentaires

1
votes

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.

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.


0 commentaires

2
votes

C ++ 0x amusant. Ce code n'est pas compilé: xxx

erreur: 'I': une capture par valeur ne peut pas être modifiée dans une Lambda non mutable


0 commentaires


1
votes

Créer un objet étrange avec une macro qui prend fichier et ligne , ce dernier éventuellement sous forme de paramètre de modèle (est-il une constante de temps de compilation?). Au fur et à mesure que vous l'incruste, il doit être utilisé le même fichier fichier et ligne . Bien la même ligne suffira probablement. Si ce n'est pas sur la même ligne, vous pouvez obtenir une erreur de compilateur. XXX

Je ne l'ai pas testé. Juste une idée.


0 commentaires