c++ - ¿Se dobla una vez cada int en la ecuación al doble?
floating-point type-conversion (4)
¿La presencia de un tipo de datos de coma flotante (por ejemplo, double
) garantiza que todas las operaciones matemáticas +, -, *, /,%, etc. asuman operandos dobles?
Si la historia es más complicada que eso, ¿hay algún recurso que describa estas reglas? ¿No debería hacer tales preguntas y siempre convertir explícitamente int
en double
cuando el resultado de la ecuación es double
? Aquí hay algunas ecuaciones en las que estoy pensando. A propósito no compilé y corrí en mi sistema, ya que este es el tipo de cosas que podrían ser dependientes del compilador.
int a(1), b(2), c(3);
double d(4.);
double result1 = a + b/d + c; // equal to 4 or to 4.5?
double result2 = (a + b)/d + c; // equal to 3 or to 3.75?
double result3 = a/b + d; // equal to 4 or to 4.5?
¿Se
double
una vez cadaint
en la ecuación aldouble
?
No. Solo el resultado de una sola operación (con respecto a la precedencia).
double result1 = a + b/d + c; // equal to 4 or to 4.5?
4.5.
double result2 = (a + b)/d + c; // equal to 3 or to 3.75?
3.75.
double result3 = a/b + d; // equal to 4 or to 4.5?
4.
A propósito no compilé y corrí en mi sistema, ya que este es el tipo de cosas que podrían ser dependientes del compilador.
Esto no depende del compilador. C ++ define claramente el orden de estas operaciones y cómo se convierten.
La forma en que ocurre la conversión depende del orden de las operaciones.
double result1 = a + b / d + c; // equal to 4 or to 4.5?
En este ejemplo, la división ocurre primero. Debido a que este es un int dividido por un doble, el compilador maneja esto convirtiendo el int en un doble. Por lo tanto, el resultado de b / d
es un doble.
Lo siguiente que hace C ++ es agregar a
resultado de b / d
. Esta es una int agregada a un doble, por lo que convierte el int en un doble y agrega, lo que da como resultado un doble. Lo mismo pasa con c
.
double result3 = a / b + d; // equal to 4 or to 4.5?
En este ejemplo, la división se maneja primero. b
son ambos enteros, por lo que no se realiza ninguna conversión. El resultado de a / b
es de tipo int y es 0.
Luego, el resultado de esto se agrega a d
. Esto es un int más un doble, entonces C ++ convierte el int en un doble, y el resultado es un doble.
Aunque hay un doble presente en esta expresión, a / b
se evalúa primero, y el doble no significa nada hasta que la ejecución alcanza el doble. Por lo tanto, ocurre una división entera.
Encuentro que las reglas de promoción y conversión son bastante complejas. Por lo general, los números enteros (cortos, int, largos) se promueven a equivalentes de coma flotante (flotante, doble). Pero las cosas se complican por las diferencias de tamaño y el signo.
Consulte esta pregunta para obtener detalles sobre la conversión.
Debe considerar la precedencia de cada operador, debe pensar como un analizador:
double result1 = a + b/d + c; // equal to 4 or to 4.5?
Eso es como + (b / d) + c porque el operador ''/'' tiene la mayor precedencia. Entonces no importa para qué de estas 2 operaciones se hace primero, porque el operando de coma flotante está en el medio, y "infecta" otros operandos y hace que sean dobles. Así que es 4.5.
double result2 = (a + b)/d + c; // equal to 3 or to 3.75?
Lo mismo aquí, es como ((a + b) / d) + c, entonces a + b es 3, ese 3 se convierte en un número de coma flotante porque se promueve a doblar, porque es el dividendo de d, que es un doble, entonces es 0.75 + 3, eso es 3.75.
double result3 = a/b + d; // equal to 4 or to 4.5?
Es como (a / b) + d, entonces a / b es cero yd es 4, entonces es 4. Un analizador realiza todas las operaciones en orden de precedencia, por lo que puede saber exactamente cuál será el resultado de la expresión.
Generalmente, si un operando de un operador binario es un punto flotante y el otro es un número entero, el entero se convierte a punto flotante, y el resultado es un punto flotante.
En una expresión compuesta, con múltiples subexpresiones, cada operador se procesa individualmente, utilizando las reglas de precedencia que probablemente conozca. Por lo tanto, en a*b + c*d
, se evalúa a a*b
, y se evalúa c*d
, y los resultados se suman. Lo que está en c*d
no tiene efecto en a*b
viceversa.
C ++ es complicado, por supuesto, y los operadores definidos por el usuario pueden tener otros comportamientos.
El recurso autorizado que define las reglas es el estándar de C ++. El estándar es bastante grande y técnico. Es posible que prefiera examinar el estándar C primero. Vea esta respuesta para enlaces a los estándares. Cualquier buen libro en C o C ++ debe describir las conversiones de tipo predeterminadas y la evaluación de expresión.