¿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?
Author: Nathan Fig, 2012-03-23

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 a bool; su valor es true si el operando convertido es false y false de lo contrario. El tipo del resultado es bool.

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 en false; cualquier otro valor se convierte en true. Un prvalue de tipo std::nullptr_t se puede convertir en un prvalue de tipo bool; el valor resultante es false.

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 ! es 0 si el valor de su operando se 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).

Es decir, el resultado neto es el mismo que con C++, excepto el tipo.

 36
Author: ildjarn,
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.

 8
Author: cctan,
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";
}
 0
Author: 01100110,
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