3 Réponses :
L'explication est très simple: = est associatif de droite à gauche, ce qui signifie que x = y = 7,5; est évalué comme x = (y = 7,5 ); donc essentiellement le même que:
x = 7.5; // 7.5 is converted to int, x receives value 7 (truncated toward 0) y = x; // value of x is converted to float, y receives 7.0F
Alors que y = x = 7,5; est évalué comme y = (x = 7,5) ; :
y = 7.5; // value is converted from double to float, y receives 7.5F x = y; // value of y is converted from float to int, x receives 7 (truncated toward 0)
Ces conversions implicites peuvent être contre-intuitives. Vous voudrez peut-être augmenter le niveau d'avertissement pour permettre au compilateur de vous avertir des erreurs potentielles et des effets secondaires indésirables.
Dans la deuxième expression,
y = x = 7.5; /* multiple assignment operator. R->L associativity */
x = 7,5 évalue en premier et vous attribuez une valeur flottante réelle 7,5 à un entier x qui conduit à la troncature de la partie fractionnaire, donc x est attribué avec 7 au lieu de 7.5 et plus tard sur y est attribué avec 7.00000
De la section C99 standard 6.3.1.4 Flottant réel et entier
Lorsqu'une valeur finie de type flottant réel est convertie en type entier autre que _Bool, la partie fractionnaire est ignorée (c'est-à-dire que la valeur est tronquée vers zéro). Si la valeur de la partie intégrale ne peut pas être représentée par le type entier , le comportement est indéfini .
Une chaîne d'affectation comme vous le montrez est évaluée de droite à gauche.
y = x = 7.5;
est identique à
x = (y = 7.5);
De plus, le résultat d'une affectation est la valeur affectée.
Cela signifie que 7.5 (type double ) est implicitement casté en float puis assigné à y . Le résultat ( 7.5f ) est alors affecté à x . Pendant cette affectation, la valeur est convertie en int et le résultat est 7 qui est stocké dans x .
Si vous changez l'ordre dans lequel vous obtenez différents types:
x = y = 7.5;
Maintenant 7.5 (type double ) est implicitement converti en int puis assigné à x . Le résultat est 7 qui est attribué à y . Maintenant, cette valeur est convertie en double mais la fraction est déjà perdue et vous obtiendrez 7.0f stocké dans y .
int x; float y;ne sont pas des initialisations , ce sont des définitionsSur le libellé: le casting n'est jamais implicite, car il implique d'être explicite. Ce que vous observez est la conversion implicite.