Je lis actuellement "le langage de programmation C - 2e édition". Dans le premier chapitre, il est expliqué qu'une opération d'un flotteur avec des résultats int. Int. Il y a ce programme: lorsque la ligne fahr = fahr + étape code> est exécutée, ne devrait pas
fahr code> devenir int? Reste-t-il un flotteur parce que j'ai été déclaré comme un flotteur? P> P>
4 Réponses :
Si le livre dit que, c'est faux. Simple que ça! P>
Lorsque vous ajoutez un entier à un flotteur, vous obtenez un flotteur. De plus, vous avez attribué le résultat à un float, il ne peut donc rien être autre chose. Les objets ne changent pas de type. P>
Pouvons-nous parler de "objets" en C?
@Economix Oui, comme C ++. Voir la section 3.14 de la norme (référence C99).
@Economix Ce n'est pas le genre d'objet que vous envisagez, cependant.
@Economix: un objet en C est une région de stockage dont le contenu peut représenter des valeurs. Par exemple, pour int x code>,
x code> est le nom de quatre octets de stockage pouvant contenir une valeur
int code> (présumer la taille de la taille de
INT code> est quatre). Ces quatre octets sont un objet.
Oui, si vous avez déclaré votre variable comme un flotteur, cela ne changera pas dans votre code. Si vous effectuez une opération entre un int et un flotteur et mettez une variable de flotteur, vous aurez un résultat de flotteur, et l'inverse est vrai, si vous mettez votre variable dans un Var Int, vous perdrez la partie décimale de votre numéro. . p>
Vous ne pouvez pas changer votre type de variable en c. P>
Cependant, dans le code actuel, le compilateur favorisera le int code> à
float code> tout en effectuant le calcul réel
+1 pour lire ce livre. C choisit la plus haute résolution sur l'arithmique, de sorte que le flotteur gagne dans votre cas. P>
32 bits float code> n'est pas une résolution supérieure supérieure à 32 bits
int code>.
Depuis que vous déclarez Toute opération arithmétique entre un Cuil en ligne de 2011 em> sup> p> une opération arithmétique entre deux Votre sortie sera fahr code> en tant que
float code>, une valeur que vous attribuez à celle-ci sera convertie en
float code>.
int code> et un
float code> aura un (code> float code> résultat. Ceci est spécifié dans le cadre des conversions arithmétiques em>: p>
6.3.1.8 Conversions arithmétiques habituelles h3>
1 de nombreux opérateurs qui attendent des opérandes de type arithmétique provoquent des conversions et des résultats de rendement
types d'une manière similaire. Le but est de déterminer un type réel commun pour les opérandes
et résultat. Pour les opérandes spécifiés, chaque opérande est converti, sans changement de type
domaine, à un type dont le type réel correspondant est le type réel commun. À moins que
explicitement indiqué autrement, le type réel commun est également le type réel correspondant de
le résultat, dont le domaine de type est le domaine de type des opérandes si elles sont identiques,
et complexe sinon. Ce modèle s'appelle les conversions arithmétiques habituelles em>:
Premièrement, si le type réel correspondant d'un seul opérand est double double code>, l'autre
L'opérande est converti, sans changement de type de type, à un type dont le type réel correspondant est
Long Double code>.
Sinon, si le type réel correspondant d'un seul opérande est double code>, l'autre
L'opérande est converti, sans changement de domaine de type, à un type dont
Le type réel correspondant est
double code>.
Sinon, si le type réel correspondant d'un seul opérande est float code>, l'autre
L'opérande est converti, sans changement de domaine de type, à un type dont
Le type réel correspondant est
float code>. 62) sup>
Sinon, les promotions entière sont effectuées sur les deux opérandes. Puis le
Les règles suivantes sont appliquées aux opérandes promus:
Si les deux opérandes ont le même type, aucune autre conversion n'est nécessaire.
Sinon, si les deux opérandes ont signé des types d'entiers ou les deux ont non signé
types entiers, l'opérande avec le type de rang de conversion entier inférieur est
converti au type de l'opérande avec plus de rang.
Sinon, si l'opérande qui a un type d'entier non signé a un rang plus grand ou
égal au rang du type de l'autre opérande, puis l'opérande avec
Le type d'entier signé est converti au type de l'opérande avec non signé
Type d'entier.
Sinon, si le type de l'opérande avec type d'entiers signé peut représenter
toutes les valeurs du type de l'opérande avec de type entier non signé, puis
L'opérande avec un type d'entier non signé est converti au type de
Opérande avec type d'entier signé.
Sinon, les deux opérandes sont converties au type d'entiers non signé
correspondant au type de l'opérande avec type entier signé.
62) Par exemple, l'ajout d'un double _complex code> et a
float code> implique juste la conversion de la
Float Code> Opérande à
Double CODE> (et produit un
Double _Complex code> résultat). sup>
blockQuote>
int code> S donnera un résultat
int code> résultat . Par exemple,
1/2 code> rendements
0 code>,
4/3 code> rendement
1 code>,
7/3 Produits
2 code>, etc. Si vous attribuez le résultat d'une division entière à une variable code> float code>, il sera stocké sous forme de
float code> , mais vous n'obtenez pas la partie fractionnée du résultat. Iow, donné code comme p>
1.0 code>, pas
1.33333 code>. Si vous souhaitez un résultat de point flottant, au moins un des opérandes doit être un type de point flottant: P>
float fahr = 4 / 3.0f;
printf( "%f\n", fahr );
Je pense que vous devez avoir mal interprété. Lorsque vous combinez le flotteur et INT, l'INT est converti en float, pas l'inverse.
Cette question peut être pertinent.
Les variables ne peuvent pas changer de type dans C.
OT: Concernant:
Celsius = (5.0 / 9,0) * (Fahr-32.0); Code> Les variables (Celsius, FAHR) ont le type
float code>, mais les littéraux (5.0, 9,0 , 32.0) avoir type
double code> un moyen bien meilleur est de déclarer les littéraux comme type
float code> en ajoutant un
F code> à la fin de chaque littéral, C'EST À DIRE
celsius = (5.0f / 9.0f) * (Fahr-32.0f); code>