2010-11-28 35 views
1

En codage avec C++ itérateurs si vous voulez obtenir la valeur précédente à quel point iterator pour vous écririez:Déréglage d'itérateur C++ et style d'incrémentation/décrément de préfixe? Est-ce que * - Iter ok sage?

*--Iter 

ou penseriez-vous mieux d'ajouter entre parenthèses comme ceci:

*(--Iter) 

?

+1

Afin de simplement obtenir la valeur précédente, je préférerais personnellement le non destructif '* (Iter-1)'. – Vlad

+0

Vlad - Je n'ai pas pensé à cette option comme dans mon cas particulier au moment où l'itérateur n'est plus utilisé après le décrément et le déréférencement. Dans ce cas - préférez-vous toujours votre suggestion sur les deux dans la question originale? –

+0

@Czarak: oui. Cela montrerait l'intention claire d'obtenir la valeur précédente, et non de changer la position de l'itérateur. Changer la position de l'itérateur indique au lecteur que la nouvelle valeur sera utilisée plus tard. – Vlad

Répondre

6

Cela n'a pas d'importance en ce qui concerne l'exactitude du programme. Mais je l'exprime toujours comme *(--Iter) parce que cela est plus auto-documenté et plus facile à comprendre pour les êtres humains que *--Iter.

+0

Les deux caractères supplémentaires, bien que redondants, le rendent beaucoup plus compréhensible en particulier pour ceux qui ne connaissent pas les règles de préséance à l'envers. – dreamlax

+4

La priorité de l'opérateur est importante si un opérande est entouré de deux opérateurs différents. Ce n'est pas le cas ici, donc la priorité de l'opérateur ** n'a aucune importance dans cet exemple **. Même si '*' avait une priorité supérieure à '--' (je ne sais pas par cœur si c'est le cas ou pas),' --' reste lié à 'Iter' car il n'y a pas de conflit. 'Iter' n'est pas un opérande de' * '. S'il s'agissait de la priorité de l'opérateur, comment le résoudriez-vous? '(* -) Iter'? Il n'y a pas de solution, car il n'y a pas de problème. 'Iter' n'a qu'un seul opérateur fixe, pas deux. – fredoverflow

+0

En fait, si vous [cherchez] (http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B), '*' et le préfixe '--' ont la même priorité d'opérateur *. (Et si vous ne faites pas confiance à Wikipedia, TC++ PL page 120 est d'accord.) Encore une fois, pas que cela a vraiment de l'importance, mais l'affirmation "-" a plus d'antériorité que de déréférencement "est ** faux **. – fredoverflow

0

Je voudrais utiliser ce dernier pour la clarté, mais les deux sont complètement valides et équivalents.

Note: En cas de confusion, cette syntaxe n'obtient pas seulement la valeur de l'itérateur prédécesseur, elle déplace l'itérateur lui-même vers l'arrière. Si vous voulez obtenir la valeur de l'itérateur prédécesseur sans modifier celui que vous avez alors vous avez besoin d'un temporaire.

+0

Non, vous n'avez pas besoin de l'itérateur après le déréférencement. –

+0

Peter - bonne suggestion par Vlad dans le commentaire sur la question ci-dessus pour obtenir la valeur de l'itérateur prédécesseur sans modifier celui que j'ai et sans utiliser un temporaire. –

0

Même si l'une de ces fonctions fonctionne comme prévu, elles sont toutes deux difficiles à lire. Est-ce que cela doit être fait dans une seule déclaration?

+0

Non, il ne doit pas s'agir d'une seule déclaration. Comment voulez-vous dire si je fais fonctionner l'un de ceux-ci comme je l'espère? Ils font tous les deux ce que j'attends et ils font tous les deux la même chose? –

+1

Je ne suis pas d'accord que ce soit difficile à lire. Les programmeurs professionnels ne seront pas lancés par là, bien que les recrues puissent l'être. –

+1

@John Ça pue de "intelligent" pour moi. J'essaie de faire en sorte que mon code C++ ressemble le moins possible à Perl. – robert

0

L'un ou l'autre est bon. Utilisez celui que vous préférez selon les normes de codage auxquelles vous devez vous conformer, ou celle que vous préférez personnellement.

+0

Priorité opérateur ne joue pas un rôle ici, voir mon commentaire sur la réponse de John. – fredoverflow

+0

Vous avez raison. Retiré cette partie. Merci! –