2015-08-05 2 views
3

J'utilise la bibliothèque GMP pour une précision arbitraire en C. Tous les exemples d'utilisation que je l'ai vu semblent éviter les affectations auto tels que:GMP: Les auto-affectations sont-elles interdites?

Syntax : void mpz_add (mpz_t rop, const mpz_t op1, const mpz_t op2) 

mpz_add(a, a, b); // Assign a+b to a 

Est-ce l'usage autorisé ou devrais-je seulement recourir à attribuer à une troisième variable?

+4

Que dit la documentation GMP à ce sujet? – fuz

Répondre

6

Il n'y a rien de mal à s'auto-assigner en tant que tel. En fait, les états documentation sont exactement opposés. Selon 3.4 Conventions variables:

GMP vous permet d'utiliser la même variable pour l'entrée et la sortie dans un appel. Par exemple, la fonction principale de la multiplication entier, mpz_mul, peut être utilisé à la case x et mettre le résultat en arrière avec x

mpz_mul (x, x, x); 
+0

La signature de multiplicaton est 'void mpz_mul (mpz_t rop, const mpz_t op1, const mpz_t op2)'. Je suis confus quant à la façon dont 'op1' et' op2' peuvent être 'const' si faire' mpz_mul (x, x, x) 'peut changer' x'. –

+0

@JustinRaymond: 'mpz_t' est défini en interne sous la forme d'un tableau à un seul élément, par conséquent ces paramètres sont passés efficacement en tant que pointeurs. L'objet réel est refermé par trois pointeurs différents. Le premier n'a pas de qualificatif 'const', donc il peut être changé via _that_ pointer. Ceci est analogue à une situation telle que int x = 100; const int * ptr1 = & x; int * ptr2 = & x; * ptr2 = 200; L'objet 'int' peut être modifié _despite_ que le pointeur' ptr1' a le qualificateur 'const'. –