2 votes

Comment la conversion est-elle effectuée dans ce code C ?

#include<stdio.h>
#include<string.h>

void printlength(char *s, char *t) {
    unsigned int c=0;
    int len = ((strlen(s) - strlen(t)) > c) ? strlen(s) : strlen(t);
    printf("%d\n", len);
}

void main() {
    char *x = "abc";
    char *y = "defgh";
    printlength(x,y);
}

Quand je le compile, cela donne 3 mais je ne comprends pas comment la conversion s'opère ici : (strlen(s) - strlen(t)) > c)

4voto

chux Points 13185

C'est un code très pauvre (strlen(s) - strlen(t)) es siempre >= 0 car il s'agit de mathématiques non signées. Le type renvoyé par strlen() es size_t , un type non signé. Ainsi, à moins que les valeurs ne soient égales, la différence est toujours un nombre positif en raison de l'enroulement des mathématiques non signées.

Puis int len = strlen(s); même lorsque la longueur de s est différent de t .

La meilleure façon d'utiliser un code similaire serait d'ajouter seulement.

// ((strlen(s) - strlen(t)) > c) 
(strlen(s) > (c + strlen(t)) 

Note : Sur de rares plateformes avec SIZE_MAX <= INT_MAX la différence peut être négative, car les calculs sont alors effectués avec l'option signé type int . Pourtant, la comparaison avec c es unsigned et qu'ensuite il se passe comme unsigned ce qui fait qu'une différence négative est transformée en un nombre très élevé, supérieur à 0. @Paul Hankin

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X