0
votes

Affectation lors du retour d'une valeur

Je ne comprends pas une fonction utilisée par mon collègue. Il ne peut pas Il utilise des blocs de retour étrange.

block_t *get_block(void *p)
{
    char *tmp;
    tmp = p;
    return (p = tmp -= 16);
}


4 commentaires

Avez-vous du code pour illustrer comment cette fonction est utilisée?


Votre collègue devrait être viré.


@ n.m. Ou promu, il n'écrira aucun code :)


Je suis juste curieux ... Est-ce le code réel que vous avez ou il est coupé?


3 Réponses :


4
votes

Tous les opérateurs C oscillent des valeurs de calcul (à l'exception d'un opérateur de distribution avec Void code> comme type cible ou appel d'une fonction à une fonction renvoyant vide code>). En particulier, les opérations d'affectation et d'op / d'affectation évaluent à la valeur attribuée. Par conséquent, cette déclaration:

block_t *get_block(void *p) {
    return (block_t *) (((char *) p) - 16);
}


8 commentaires

De plus, il contient des étapes inutiles: le p et TMP sont des variables locales qui seront détruites après la déclaration de retour de toute façon. Vous n'avez pas besoin de sauvegarder la valeur de p avant de modifier. De plus, votre code est équivalent à juste block_t * get_block (vide * p) {return (((char *) p) - 16;} .


D'accord, @michaelbeer. Je mettais à jour cette réponse pour dire la même chose lorsque vous avez écrit votre commentaire.


N'était pas destiné à critiquer la réponse valide. Je pense que les trucs d'affectation dans le code d'origine sont principalement là pour éviter les avertissements du compilateur en raison de moules de type?


Pas de soucis, @Michaelbeer, je ne l'ai pas pris comme critique. Comme je l'ai dit, j'avais exactement la même pensée à peu près au même moment.


Re "Tous les opérateurs C calculant des valeurs de calcul": sauf count à vide et une fonction avec le type de retour nul. 😀


Reconnus et mis à jour, @ERICPOSTPISCHIL. Un de ces jours, je vais apprendre à faire plus attention à la traînée autour de "tous".


Le code de remplacement nécessite une dernière distribution sur Void * ou block_t * . Sinon, il tente de renvoyer un char * pour un block_t * , qui sont probablement des types incompatibles. Hmm, à ce moment-là, il s'agit d'une sorte de désordre visuellement. Je peux donc en quelque sorte voir la valeur visuelle d'appel et de divertissement de retour P = TMP - = 16; , pas que je le recommanderais.


Je devais vérifier, @ericpostpischil, mais contrairement à ce que je pensais savoir, char * et block_t * semble être des types incompatibles. J'ai ajouté le casting. Je vois ce que tu veux dire à propos de l'expression quelque peu compliquée, mais je ne pense pas que ce soit assez mauvais pour moi, personnellement, d'ajouter une variable temporaire. Ymmv.



0
votes

Il n'y a rien de spécial avec retour code>. C'est juste une expression comme dans n'importe quel autre endroit.

Vous pouvez le réécrire comme suit: P>

block_t *get_block(void *p)
{
    char *tmp = p;
    tmp -= 16;
    return (block_t *)tmp;
}


0 commentaires

-1
votes

C'est très facile, mais très incorrect, non portable et sujet à une erreur.

Il prend l'adresse 16 caractères plus tôt et le retourne. Il doit faire du pointeur arithmétique sur le pointeur de Char, il a donc besoin de le faire de char. La seconde affectation n'est pas nécessaire


0 commentaires