2011-04-25 25 views
8

quiero para asegurarse de que mi comprensión del tipo de retorno de la división C++,C++ - tipo de la división?

int/int => return is int? 

float/float => return is which type? float? 

double /double => return is double? 

int/double => return is double? 

int/float => return is float? 

Por favor, corríjanme si estoy equivocado.

Gracias

Respuesta

8

Todos ellos son correctos.Esto es lo que dice el estándar C++ 03 (§ 5/9):

Muchos operadores binarios que esperan operandos de tipo aritmético o enumeración de las conversiones de causa y tipos de resultados de rendimiento de una manera similar. El propósito es producir un tipo común, que también es el tipo del resultado. Este patrón se llama los conversiones aritméticas habituales, que se definen como sigue:

  • Si alguno de los operandos es de tipo long double, el otro se convertirán a long double.
  • De lo contrario, si cualquiera de los operandos es double, el otro se convertirá en double.
  • De lo contrario, si cualquiera de los operandos es float, el otro se convertirá en float.
  • De lo contrario, las promociones integrales (4.5) se realizarán en ambos operandos.
  • Entonces, si cualquiera de los operandos es unsigned long, el otro se convertirá en unsigned long.
  • lo contrario, si un operando es una long int y el otro unsigned int, a continuación, si un long int puede representar todos los valores de una unsigned int, la unsigned int se convertirá a un long int; de lo contrario, ambos operandos se convertirán a unsigned long int.
  • De lo contrario, si cualquiera de los operandos es long, el otro se convertirá en long.
  • De lo contrario, si cualquiera de los operandos es unsigned, el otro se convertirá en unsigned.

[Nota: de lo contrario, el caso único que queda es que ambos operandos son int]

1

Usted es correcto en todos los casos. Las reglas para operaciones que involucran al menos un tipo de punto flotante son que si cualquiera de los tipos es long double, el resultado es long double; de lo contrario, si cualquiera de los tipos es double el resultado es double; de lo contrario, el resultado tiene el tipo float.

Las operaciones aritméticas entre dos int producen un resultado de int.

Las reglas entre otros tipos son un poco más complejas y pueden depender de la implementación; para casi todas las operaciones, las promociones enteras significan que los operandos se promocionan a al menos un tipo de tamaño int que produce al menos un resultado de tamaño int.

1

considerando sólo tres tipos (float, double y int):

  • Si alguno de los operandos es double, entonces el resultado será double.
  • Si el operando es float, el resultado será float.
  • Si no, el resultado será int.
+1

Es que la segunda bala destinada a ser un "else if"? De cualquier forma, el orden de las dos primeras balas es al revés, y olvidaste el doble largo. –

+0

@Eric: Buen punto. Editado. – Nawaz

0

Se escribirá el resultado (si existe la regla) para la asignación. Si tiene int x = dY + iZ; Entonces la promoción hará que el resultado de la suma sea el doble, pero se convertirá a int cuando está asignado a x. Google "promoción variable en C++" para más detalles.

4

operator/ para tipos de datos básicos (al igual que la mayoría de operadores, si no todos, para tipos básicos) devuelve el tipo más fuerte de sus dos operandos.

La respuesta a todas sus preguntas es, por lo tanto, sí.


En general, los tipos de punto flotante son más fuertes que los enteros sin signo y son más fuertes que firmados ...

Definición> como "más fuerte que", podemos decir que:

doble largo > double> float> unsigned long> long> unsigned int> int> unsigned short> short> unsigned char> char

+0

¿Está seguro de que no tiene "T sin firmar" y "T" fuera de servicio? –

+0

@Chris A .: hum, sí. 'T sin firmar 'es más fuerte que' T'. También vea @ildjarn responder. – peoro

+0

Gracias, aprendí algo. +1 –

0

En general, en C++, en cualquier escenario, ambos operandos se convierten al tipo "más grande" del dos tipos de operandos antes de la operación es exe ejecutado Vea MSDN Standard Arithmetic Conversions.