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?
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?
cuanto a C++, citando C++ 11 §5.3.1/9:
El operando del operador de negación lógica
!
es contextualmente convertidos abool
; su valor estrue
si el operando convertido esfalse
yfalse
en caso contrario. El tipo de resultado esbool
.
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 afalse
; cualquier otro valor se convierte atrue
. Un prvalue de tipostd::nullptr_t
se puede convertir a un prvalue de tipobool
; el valor resultante esfalse
.
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
!
es0
si el valor de su operando compara desigual a0
,1
si el valor de su operando se compara igual a0
. El resultado tiene el tipoint
. La expresión!E
es equivalente a(0==E)
.
I.e. el resultado neto es el mismo que con C++, excepto el tipo.
Vea usted mismo:
#include <iostream>
int main()
{
float a = 2.5;
if (!a)
std::cout << !a << "\n";
else
std::cout << !a << "\n";
}
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
No se puede "esperar" nada desde el comportamiento "definido por la implementación". Entonces, ¿qué significa "bien definido" para ti? – 01100110
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
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.
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 –
si exactamente + 0.0f, -0.0f tiene un bit establecido e invertido aún tiene un bit establecer –
@dwelch No lo sabía, supongo que aprendes algo nuevo todos los días – cctan
Posible respuesta [aquí] (http://stackoverflow.com/questions/1969620/c-float-to-bool-conversion) – cctan