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++?
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++.)
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é.
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.)