J'étais en train de parcourir un livre sur C et il y a ce "ANALYSER!" problème que je ne peux pas tout à fait déchiffrer / comprendre. Il a ce code présenté:
void x(int *y, int *z)
{
*y = *y ^ *z;
*z = *y ^ *z;
*y = *y ^ *z;
}
Après avoir montré cela, il a demandé une meilleure façon de nommer la fonction que "x". Après avoir renommé la fonction, il a dit "Déterminez le rôle de cette fonction en * y et * z."
Tout cela est assez vague pour moi. Qu'impliquent les questions? De plus, comment puis-je comprendre et répondre à cela?
3 Réponses :
Les questions qui vous sont posées à propos de cette fonction sont, en gros, «que fait réellement cette fonction?» Et «sur cette base, quel serait le nom approprié pour cette fonction?
«Déterminer le rôle de cette fonction sur * y et * z» me semble être une question étrangement formulée, je pourrais le formuler comme «quel effet cette fonction a-t-elle sur les valeurs * y et * z?».
Le meilleur nom pour cette fonction est "swap".
C'est un poisson, si jamais j'en ai vu un.
Astuce: exprimez tout en termes d'entrées d'origine pour obtenir le code équivalent suivant.
void x(int *y, int *z)
{
int yy = *y, zz = *z;
*z = (yy ^ zz) ^ zz;
*y = (yy ^ zz) ^ ((yy ^ zz) ^ zz);
}
Ensuite, simplifiez les côtés droits en utilisant que ^ est associatif, commutatif et a ^ a = 0 .
Il semble que l'on vous demande d'expliquer ce que fait la fonction (échange le contenu des adresses passées en utilisant XOR) puis un meilleur nom pour la fonction est
swap()Remarque: les opérations XOR doivent être écrites séparément (comme dans votre question) et non enchaînées, par exemple
*y ^ *z && *y ^= *z ^= *y ^= *zVoir Echange de valeurs avec XOR (UB).