3
votes

Conversion de type implicite de double à int?

  y = x = 7.5;
c

2 commentaires

int x; float y; ne sont pas des initialisations , ce sont des définitions


Sur le libellé: le casting n'est jamais implicite, car il implique d'être explicite. Ce que vous observez est la conversion implicite.


3 Réponses :


8
votes

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.


0 commentaires

2
votes

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 .


0 commentaires

4
votes

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 .


0 commentaires