c++ - que - tipos de variables en java ejemplos
¿Por qué es la suma de un int y un float un int? (3)
Considere el siguiente código:
float d = 3.14f;
int i = 1;
auto sum = d + i;
De acuerdo con cppreference.com , se debería convertir a float
cuando se agrega a d
. Sin embargo, cuando ejecuto el código, encuentro que la sum
es 4. ¿Por qué sucede esto?
Curiosamente, cuando puse explícitamente mi compilador en modo C11, encontré que la sum
era 4.14. ¿Qué reglas cambia el estándar C11 que afectan el resultado?
¿Qué pasaría si compilara el mismo código usando un compilador de C ++?
En C (y C ++), 3.14f + 1
es un tipo float
debido a la promoción de tipo de int
a float
.
Pero en C, hasta e incluyendo C90, y tal estándar posiblemente sea el valor predeterminado de su compilador de C, este se asigna a un tipo int
, produciendo 4, ya que int
es el tipo predeterminado para una variable con duración de almacenamiento automático. A partir de C99, la compilación fallará a medida que se retire el int implícito, aunque los compiladores aún podrían permitirlo, con una advertencia.
(En C ++ 11 y posteriores, auto
indica al compilador que deduzca el tipo. sum
será un valor float
con valor 3.14f + 1
como C ++ 98 o C ++ 03 aún puede funcionar, pero genera una advertencia sobre Extensiones de C ++ 11. Esto es lo que hace clang, por ejemplo . Esta redefinición de auto
en C ++ 11 representa otra divergencia material entre C y C ++.)
En algunos compiladores, los archivos con la extensión .c
se compilan como C, no como C ++.
float d = 3.14f;
int i = 1;
auto sum = d + i;
compilado como
float d = 3.14f;
int i = 1;
int sum = d + i;
En el lenguaje C, auto
es una palabra clave para especificar una duración de almacenamiento. Cuando creas una variable auto
tiene una "duración de almacenamiento automático". Llamamos a estos objetos "variables locales". En C, todas las variables en las funciones son locales por defecto. Es por eso que la palabra clave auto
casi nunca se usa.
La palabra clave auto
es inútil en el lenguaje C. Está ahí porque antes del lenguaje C existía un lenguaje B en el que esa palabra clave era necesaria para declarar variables locales. (B se desarrolló en NB, que se convirtió en C.)
Es bastante simple en realidad.
En versiones antiguas de C (antes de C99), podrías escribir algo como
auto n = 3;
y n
sería un tipo int
con el valor 3. También podría escribir
auto n = 3.14f;
y n
aún sería un tipo int
, con un valor 3.
Esto fue llamado int implícito y K & R lo hizo bastante famoso.
Así que puedes ver eso
auto sum = d + i;
simplemente asigna el tipo float
d + i
a la sum
que es un int
implícito.
De ahí la respuesta 4.
En las versiones más nuevas de C (C99 en adelante), se eliminó el int implícito.