2012-03-23 17 views
23

Supongo que esto solo devuelve un int. ¿Hay algo más en juego que deba tener en cuenta? C/C++ diferencias?¿Qué sucede cuando no es lógico un flotador?

float a = 2.5; 
!a; // What does this return? Int? Float? 
+2

Posible respuesta [aquí] (http://stackoverflow.com/questions/1969620/c-float-to-bool-conversion) – cctan

Respuesta

36

cuanto a C++, citando C++ 11 §5.3.1/9:

El operando del operador de negación lógica ! es contextualmente convertidos a bool; su valor es true si el operando convertido es false y false en caso contrario. El tipo de resultado es bool.

Entonces, ¿qué es realmente relevante aquí es el comportamiento de static_cast<bool>(some_float) – citando §4.12/1:

Un prvalue de la aritmética, la enumeración sin ámbito, puntero, o puntero al tipo de miembro se puede convertir en un prvalue de tipo bool. Un valor cero, valor de puntero nulo o valor de puntero de miembro nulo se convierte a false; cualquier otro valor se convierte a true. Un prvalue de tipo std::nullptr_t se puede convertir a un prvalue de tipo bool; el valor resultante es false.

poner esas juntas, 2.5f es un valor distinto de cero y por consiguiente se evaluará como true, que cuando negada evaluará a false. Es decir, !a == false.


Con respecto a C, citando C99 §6.5.3.3/5:

El resultado del operador negación lógica ! es 0 si el valor de su operando compara desigual a 0, 1 si el valor de su operando se compara igual a 0. El resultado tiene el tipo int. La expresión !E es equivalente a (0==E).

I.e. el resultado neto es el mismo que con C++, excepto el tipo.

+0

¡Gracias! Supongo que esto significa que en C obtendría un int? –

+1

@ Nathan: Sí, eso es correcto. Respuesta editada con detalles. – ildjarn

+3

@NathanFig: Correcto, el resultado de '!' En C siempre es un 'int'. – caf

0

Vea usted mismo:

#include <iostream> 

int main() 
{ 
    float a = 2.5; 

    if (!a) 
     std::cout << !a << "\n"; 

    else 
     std::cout << !a << "\n"; 
} 
+9

El problema con "ver por ti mismo" es que puedes observar un comportamiento indefinido o definido por la implementación, que solo te dice lo que sucede en tu plataforma/compilador particular, que no es útil cuando sabes qué esperar en términos de un comportamiento bien definido . – ildjarn

+0

No se puede "esperar" nada desde el comportamiento "definido por la implementación". Entonces, ¿qué significa "bien definido" para ti? – 01100110

+9

Exactamente, por lo que "ver por ti mismo" es una respuesta inútil si el comportamiento está definido por la implementación. Gracias por aceptar mi punto. :-P – ildjarn

7

De here

Un flotador se convertirá en falso si es exactamente 0.0f,
También será verdadera si no es exacly 0.0f!
Inifinity también se convertirá en verdadero.

+2

No estaba seguro acerca de la negación del infinito, así que eché un vistazo aquí está la salida http://ideone.com/WWoJB#view_edit_box –

+0

si exactamente + 0.0f, -0.0f tiene un bit establecido e invertido aún tiene un bit establecer –

+0

@dwelch No lo sabía, supongo que aprendes algo nuevo todos los días – cctan

Cuestiones relacionadas