tipos tipo que programacion long float ejemplos datos dato c++ c type-conversion

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.