7
votes

Est arithmétique sur les pointeurs associatifs?

Si je dis, xxx

maintenant, si j'écris p + 1 + 2 sera-t-il identique à celui ((p + 1) + 2) ? Toute référence standard qui prouve ce faux?


2 commentaires

Addition associée à gauche-droite, donc p + 1 + 2 est certainement équivalent à (p + 1) +2 . Ce qui est plus intéressant, c'est que c'est équivalent à p + (1 + 2) .


@Yappie: p ++ n'est pas le même que p + 1 . Le premier modifie la valeur de p .


5 Réponses :


1
votes

Je sors que oui dans la pratique, mais peut-être non en théorie.

Vous vous demandez si p + 3 est identique que ((p + 1) + 2) mais la norme indique que l'arithmétique du pointeur n'a aucun sens à l'intérieur d'un tableau ou juste un élément passé à sa fin.


5 commentaires

À tout le moins, c'est «non» pour les itérateurs - j'ai été mordu par cela dans le passé. Je n'ai pas personnellement été mordu par celui-ci avec des indicateurs, il peut donc s'agir davantage d'un problème théorique que pratique, mais je vous tromperais du côté de la prudence.


La question portait sur des pointeurs sur int -s sans mention d'itérateurs.


En effet, c'est pourquoi je t'avais précipité :) Je le mentionne simplement en passant parce que c'est une question connexe.


Pourquoi pensez-vous que les itérateurs sont comme un pointeur? Ils ne sont pas -excepts pour la notation (Infix * et ++ ).


Je ne pense pas qu'ils ressemblent à un pointeur. La notation est le point ici: Considérons Vec.begin () + 10 - 9 Par exemple.



1
votes

Les pointeurs sont vraiment des chiffres, alors oui, une addition sera associative de la manière dont vous décrivez.

Edit: Voir le commentaire ci-dessous de Delnan - tandis que oui, l'addition sera associative, ma déclaration que les pointeurs ne sont que des chiffres ne sont pas tout à fait corrects.


4 commentaires

Si vous traitez des pointeurs comme des chiffres seulement, vous vous évitez dans le domaine du comportement indéfini.


Pouvez-vous clarifier ce que vous voulez dire? Ne sont-ils pas simplement adressés?


Exactement, ils sont adresses avec un type. Pas des chiffres. Par exemple, p + 1 vous donne un pointeur à l'emplacement de stockage après p - du même type que le précédent - et non le prochain numéro naturel.


C'est un bon point et une distinction importante. Merci de clarifier. Je vais éditer mon message pour vous assurer que les lecteurs voient ceci.



3
votes

§3.7.4.3

2 Une valeur de pointeur est un pointeur dérivé en toute sécurité sur un objet dynamique uniquement s'il a un type de pointeur à l'objet et il est L'une des opérations suivantes: ... résultat d'une arithmétique de pointeur bien définie (5.7) en utilisant une valeur de pointeur dérivée en toute sécurité;

§ 5.7

3 Le résultat de l'opérateur binaire + est la somme des opérandes.

Cela me semble légitime.


4 commentaires

Pouvez-vous créer un lien vers l'endroit où vous avez trouvé cela?


Le brouillon est gratuit sur ISO . La finale que vous payez à ISO (la plupart des gens utilisent ébauche)


Si vous êtes vraiment rusé, vous attrapez une copie de N3290 alors qu'elle était exempte d'ISO. C'est le FDIS, c'est-à-dire le projet qui a été voté pour devenir la norme. Il devrait être que la seule différence entre les FDIS et la norme est la mise en forme.


Je ne suis pas sûr que c'est rusé tant que la chronologie chanceuse. Je n'avais pas de chance de chanceux :(



4
votes

Seulement si vous ne sortez pas de portée. Par exemple, dans ceci: xxx

l'affectation à p invoque un comportement indéfini, alors que l'affectation à q n'est pas.

tant que vous restez dans la plage, cependant, vous m'attendez à une association à tenir.

Incidemment, notez que dans votre question, les deux choses que vous donnez sont les mêmes par définition, depuis l'ajout (Eh bien, l'ajout à portée de toute façon) est laissé-associatif. C'est-à-dire x + y + z == (x + y) + z , pas x + (y + z) .


1 commentaires

De même, le comportement de 1+ (A-B) peut être défini même lorsque (1 + a) ne le ferait pas. Je ne sais pas si c'est possible pour (1 + a) -b à définir quand (A-B) ne serait pas, bien que cela soit concevable. Je ne suis pas sûr dans quels cas une "provenance" du pointeur est autorisée à affecter ce qui peut être fait avec elle.



2
votes

L'ajout entre un pointeur et un entier est défini dans C ++ 11 comme suit (5.7 / 5):

Si l'expression p pointe sur le i-ème élément d'un objet de tableau, le expressions (p) + n (équivalent, n + (p)) et (p) -n (où n a le valeur n) point à, respectivement, le i + N-e et I - N-ème éléments de L'objet Array, à condition d'exister.

La phrase suivante parle des pointeurs un au-delà de la fin des tableaux.

Ainsi, l'ajout impliquant des pointeurs est "la même chose que" addition impliquant des index, qui est bien sûr associative. À partir de là, vous pouvez en déduire que, à condition que les éléments de tableau existent (ou sont un antérieur à la fin), puis une addition impliquant des pointeurs est associative.

Si votre arithmétique dépasse les limites de la matrice que le pointeur pointe dans, le comportement est indéfini, et il n'est donc pas nécessaire de ne pas être associatif.


0 commentaires