Pregunta

He estado intentando reducir las conversiones de tipos implícitas cuando uso constantes con nombre en mi código.Por ejemplo, en lugar de utilizar

const double foo = 5;

yo usaría

const double foo = 5.0;

para que no sea necesario realizar una conversión de tipo.Sin embargo, en expresiones donde hago algo como esto...

const double halfFoo = foo / 2;

etc.¿Ese 2 se evalúa como un número entero y se convierte implícitamente?¿Debería utilizar un 2.0 en su lugar?

¿Fue útil?

Solución

El 2 se convierte implícitamente a un doble porque foo es un doble. Usted tiene que tener cuidado porque si foo era, digamos, una división de enteros, número entero se llevaría a cabo y luego el resultado se almacena en halfFoo.

Creo que es una buena práctica usar siempre literales de punto flotante (por ejemplo 2.0 o 2. donde tiene la intención de que sean utilizados como valores de punto flotante. Es más consistente y puedo ayudarle a encontrar errores perniciosos que pueden surgir con este tipo de cosas.

Otros consejos

Esto se conoce como Tipo coerción . Wikipedia tiene un buen poco de ella:

  

conversión de tipo implícito, también conocido como la coacción, es una conversión de tipo automática por el compilador. Algunos lenguajes permiten, o incluso requieren, compiladores para proporcionar la coacción.

     

En una expresión de tipo mixto, los datos de uno o más subtipos se puede convertir en un supertipo, según sea necesario en tiempo de ejecución para que el programa va a funcionar correctamente.

     

...

     

Este comportamiento se debe usar con precaución, ya que pueden surgir consecuencias no deseadas. Los datos pueden perderse cuando las representaciones de coma flotante se convierten en representaciones integrales como los componentes fraccionarios de los valores de coma flotante se truncarán (abajo redondeado). A la inversa, la conversión de una representación integral a una de coma flotante puede precisión también pierden, ya que el tipo de coma flotante puede ser incapaz de representar el número entero exactamente (por ejemplo, flotador podría ser un tipo de IEEE 754 de precisión simple, que no puede representar el número entero 16777217 exactamente, mientras que un tipo entero de 32 bits puede). Esto puede llevar a situaciones tales como el almacenamiento del mismo valor entero en dos variables de tipo entero y el tipo real, que falsa declaración si se compara por la igualdad.

En el caso de C y C ++, el valor de una expresión de tipos integrales (es decir, números enteros largos, pantalones cortos, caracteres) es el tipo integral más grande en la expresión. No estoy seguro, pero me imagino algo parecido ocurre (suponiendo valores de punto flotante son "más grande" que los tipos enteros) con expresiones que se usan números de punto flotante.

En rigor, lo que intentas conseguir parece contraproducente.

Normalmente, uno se esforzaría por reducir el número de explícito conversiones de tipos en un programa C y, en general, para reducir todas y cada una de las dependencias de tipos en el código fuente.Un buen código C debe ser lo más independiente posible del tipo.En general, eso significa que es una buena idea evitar cualquier elemento sintáctico explícito que describa tipos específicos con la mayor frecuencia posible.es mejor hacer

const double foo = 5; /* better */

que

const double foo = 5.0; /* worse */

porque este último es redundante.Las reglas de conversión de tipos implícitas del lenguaje C garantizarán que el primero funcione correctamente.Lo mismo puede decirse de las comparaciones.Este

if (foo > 0)

es mejor que

if (foo > 0.0)

porque, nuevamente, el primero es más independiente del tipo.

La conversión de tipos implícita en este caso es algo muy bueno, no malo.Le ayuda a escribir código genérico independiente del tipo.¿Por qué intentas evitarlos?

Es cierto que en algunos casos no tienes otra opción que expresar el tipo explícitamente (como usar 2.0 en lugar de 2 etcétera).Pero normalmente uno lo haría sólo cuando realmente es necesario.No entiendo por qué alguien lo haría sin una necesidad real.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top