web-dev-qa-db-fra.com

Pourquoi la somme d'un int et d'un float d'un int?

Considérons le code suivant:

float d  = 3.14f;
int   i  = 1;
auto sum = d + i;

Selon cppreference.com , i devrait être converti en float lorsqu’il est ajouté à d. Cependant, lorsque je lance le code, je trouve que sum vaut 4. Pourquoi cela se produit-il?

Fait intéressant, quand j'ai explicitement mis mon compilateur en mode C11, j'ai trouvé que sum était de 4.14. Quelles règles la norme C11 modifie-t-elle qui affecte le résultat?

Que se passerait-il si je compilais le même code à l'aide d'un compilateur C++?

45
jfxu

En C (et C++), 3.14f + 1 est un type float dû à type promotion de int à float.

Mais en C, jusqu’à C90 inclus, et une telle norme pourrait bien être la valeur par défaut du compilateur C, elle est affectée à un int type, donnant 4, puisque int est le type par défaut pour une variable à durée de stockage automatique. A partir de 99Ca, la compilation échouera, car un int implicite a été retiré, bien que les compilateurs puissent toujours le permettre, avec un avertissement.

(Dans C++ 11 et versions ultérieures, auto demande au compilateur de déduire le type. sum sera un float avec la valeur 3.14f + 1. Compiler en C++ 98 ou C++ 03 peut toujours fonctionner, mais génère un avertissement concernant les extensions C++ 11. C'est ce que fait Clang, par exemple . Cette redéfinition de auto en C++ 11 représente une autre divergence importante entre C et C++.)

129
Bathsheba

C'est plutôt simple, vraiment.

Dans les anciennes versions de C (avant C99), vous pourriez écrire quelque chose comme

auto n = 3;

et n serait un type int avec la valeur 3. Vous pouvez aussi écrire

auto n = 3.14f;

et n serait toujours serait un type int, avec une valeur 3.

Cela s'appelait int implicite et K & R le rendit assez célèbre.

Alors pouvez-vous voir que

auto sum = d + i;

assigne simplement le float type d + i à sum qui est un int implicite.

D'où la réponse 4.

Dans les nouvelles versions de C (à partir de C99), int implicite a été supprimé.

5
P45 Imminent

Dans certains compilateurs, les fichiers avec une extension .c Sont compilés en C, pas C++.

float d = 3.14f;
int i = 1;
auto sum = d + i;

compilé comme:

float d = 3.14f;
int i = 1;
int sum = d + i;

En langage C, auto est un mot-clé permettant de spécifier une durée de stockage. Lorsque vous créez une variable auto, celle-ci a une "durée de stockage automatique". Nous appelons ces objets "variables locales". En C, toutes les variables des fonctions sont locales par défaut. C’est pourquoi le mot clé auto n’est pratiquement jamais utilisé.

Le mot-clé auto est inutile en langage C. C'est là parce qu'il existait avant le langage C un langage B dans lequel ce mot clé était nécessaire pour déclarer des variables locales. (B a été développé en NB, qui est devenu C.)

2
Amir Saniyan