45 votes

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 devraient être converties en float lorsqu'il est ajouté à l' d. Cependant, lorsque j'ai fait exécuter le code, je trouve qu' sum 4. Pourquoi est-ce arrivé?

Fait intéressant, lorsque j'ai choisi de mettre mon compilateur en C11 mode, j'ai trouvé qu' sum a été 4.14. Quelles règles le C11 standard de changement qui affectent le résultat?

Qu'arriverait-il si j'ai compilé le même code à l'aide d'un compilateur C++?

129voto

Bathsheba Points 23209

En C (et C++) 3.14f + 1 est float type en raison de la promotion du type d' int de float.

Mais en C, jusqu'à et y compris C90, et une telle norme pourrait bien éventuellement être votre compilateur C par défaut, il est affecté à un int type de rendement de 4, depuis int est le type par défaut pour une variable automatique de la durée de stockage. Depuis le C99 à partir de la compilation échouera comme implicite int a été retirée, bien que les compilateurs pourrait encore se le permettre, avec un avertissement.

(En C++11 et plus tard, auto indique au compilateur de déduire le type. sum sera float valeur 3.14f + 1. La compilation C++98 ou C++03 mai encore du travail, mais qui génère un avertissement au sujet de C++11 extensions. C'est ce que clang n', par exemple. Cette re-définition de l' auto en C++11 représente un autre matériau de divergence entre le C et le C++.)

5voto

Slodge Monster Points 1129

C'est assez simple, vraiment.

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

auto n = 3;

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

auto n = 3.14f;

et n serait encore être un int , avec une valeur de 3.

Cela a été appelé implicite de type int et K & R fait assez célèbre.

Donc vous pouvez voir que

auto sum = d + i;

seulement affecte l' float type d + i de sum qui est implicite int.

C'est pourquoi la réponse 4.

Dans les versions plus récentes de C (C99 à partir), implicite int a été abandonné.

2voto

Amir Saniyan Points 2406

Dans certains compilateurs, des fichiers avec un .c extension sont compilés comme le C, pas du C++.

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

compilé en tant que:

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

Dans le langage C, auto est un mot-clé pour la spécification d'une durée de stockage. Lorsque vous créez un auto variable il a un "automatique de la durée de stockage". Nous appelons ces objets "variables locales". En C, les variables dans les fonctions locales par défaut. C'est pourquoi le mot-clé auto n'est quasiment jamais utilisé.

L' auto mot-clé est inutile dans le langage C. Elle est là, parce que, avant le langage C, il existe un B langue dans laquelle le mot a été nécessaire pour la déclaration des variables locales. B a été développé en NB, qui est devenu C.)

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