0
votes

Renommer une fonction et identifier son fonctionnement

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?

c

2 commentaires

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 ^= *z Voir Echange de valeurs avec XOR (UB).


3 Réponses :


3
votes

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


0 commentaires

-1
votes

Le meilleur nom pour cette fonction est "swap".


1 commentaires

C'est un poisson, si jamais j'en ai vu un.



3
votes

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 .


0 commentaires