Otros ya le han dicho, 5 y 9 son ambos enteros y es por eso que el resultado se trunca.
voy a añadir una explicación para la comprensión más profunda de lo que realmente sucede entre las líneas:
double tempC;
double tempF;
tempC = (5/9) * (tempF-32); // removed unnecessary parenthesis
dependiendo de qué orden de evaluación, de izquierda a derecha o de derecha a izquierda su compilador específico utiliza, o comenzará a evaluar la sub-expresión (5/9)
o (tempF-32)
.
¡No puede saber cuál de estos dos se evalúa primero! Porque el orden de evaluación es un comportamiento no especificado en C, lo que significa que el compilador puede hacerlo de cualquier manera sin documentar cómo. Por lo tanto, nunca se debe escribir un código que dependa del orden de evaluación, o no será portátil y posiblemente incorrecto.
Supongamos que un compilador específico utiliza la evaluación de izquierda a derecha.
- Las reglas de precedencia del operador de C deciden dónde comienza la evaluación. El operador de paréntesis tiene la prioridad más alta en C, por lo que el compilador comenzará evaluando el contenido del primer paréntesis encontrado.
- Por lo tanto, comenzará con la expresión
(5/9)
.
- El compilador comprueba el tipo de cada operando.
- En este caso, ambos son literales enteros constantes. Los literales enteros siempre son del tipo
int
en C.
- Como ambos operandos son del mismo tipo, no se necesitan conversiones de tipo implícitas.
- El cálculo se realiza en un tipo
int
y el resultado es un int
.
Así que ahora la expresión se evalúa ahora a:
tempC = (int)0 * (tempF-32);
- El compilador evalúa entonces (tempF-32).
- Los tipos de operandos son
double
y int
. No son del mismo tipo.
- Se producen conversiones de tipo implícito. En este caso, algo llamado balanceo (formalmente llamado las conversiones aritméticas usuales).
- Las reglas de equilibrio dicen que si un tipo es doble y el otro es algo diferente, el otro tipo debe convertirse a doble.
- Después de la conversión de tipo implícita, la expresión ahora es equivalente a
(double)tempF - (double)32.0
. El resultado de esto se calcula y almacena en una variable temporal e invisible de tipo double
. Esta variable invisible se almacena en un registro de CPU o en la pila.
Ahora la expresión puede ser descrito como
tempC = (int)result1 * (double)result2;
donde "RESULT1" es 0 y "result2" es el resultado de tempF - 32.0.
- El compilador luego evalúa esta nueva expresión. Encuentra un
int
y un double
.
- De nuevo, se produce el equilibrio y el int se convierte en un doble.
- La multiplicación se realiza en dos dobles, y el resultado es un doble.
- El resultado se almacena en otra variable temporal e invisible.
tempC = (double)result3;
- El compilador evalúa esta nueva expresión.Encuentra que un doble debe guardarse dentro de un doble. Eso no es un problema, por lo que no se necesitan conversiones implícitas. "result3" se almacena en tempC.
Es truncamiento, sin embargo, no se redondea. – jmkeyes
Gracias por la corrección terminológica. :) – Mysticial
doh! Gracias ... eso tiene sentido ahora. Vi algunos ejemplos con el decimal pero el centavo no cayó. ¡Gracias a todos! –