¿Qué pasa cuando no es lógico un flotador?
Asumo que esto solo devuelve un int. ¿Hay algo más que deba saber? Diferencias C / C++?
float a = 2.5;
!a; // What does this return? Int? Float?
3 answers
Con respecto a C++, citando C++11 §5.3.1/9:
El operando del operador de negación lógica
!
se convierte contextualmente abool
; su valor estrue
si el operando convertido esfalse
yfalse
de lo contrario. El tipo del resultado esbool
.
Entonces lo que es realmente relevante aquí es el comportamiento de static_cast<bool>(some_float)
– citando §4.12 / 1:
Un prvalue de tipo aritmético, enumeración sin ámbito, puntero o puntero a miembro se puede convertir en un prvalue de tipo
bool
. Un valor cero, un valor de puntero nulo o un valor de puntero de miembro nulo se convierte enfalse
; cualquier otro valor se convierte entrue
. Un prvalue de tipostd::nullptr_t
se puede convertir en un prvalue de tipobool
; el valor resultante esfalse
.
Juntando esos valores, 2.5f
es un valor distinto de cero y, en consecuencia, evaluará a true
, que cuando se niega evaluará a false
. I. e., !a
== false
.
Con respecto a C, citando C99 §6.5.3.3 / 5:
El resultado del operador de negación lógica
!
es0
si el valor de su operando se 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)
.
Es decir, el resultado neto es el mismo que con C++, excepto el tipo.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-24 19:24:47
Desde aquí
Un float se convertirá a false si es exactamente 0.0 f,
También será cierto si no es exactamente 0.0 f!
Inifinity también se convertirá en verdadero.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:31:45
Compruébelo usted mismo:
#include <iostream>
int main()
{
float a = 2.5;
if ( !a )
std::cout << !a << "\n";
else
std::cout << !a << "\n";
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-23 03:33:52