Что происходит, когда вы логически не поплавок? - PullRequest
24 голосов
/ 23 марта 2012

Я предполагаю, что это просто возвращает int. Что-нибудь еще происходит, о чем я должен знать? Различия C / C ++?

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

Ответы [ 3 ]

36 голосов
/ 23 марта 2012

Относительно C ++, цитирование C ++ 11 §5.3.1 / 9:

Операнд оператора логического отрицания ! контекстно преобразуется в bool;его значение равно true, если преобразованный операнд равен false и false в противном случае.Тип результата: bool.

Так что здесь действительно имеет отношение static_cast<bool>(some_float) - цитирование §4.12 / 1:

Значение арифметики, перечисление с незаданной областью, указатель или указатель на тип элемента может быть преобразовано в значение типа bool.Нулевое значение, значение нулевого указателя или значение указателя нулевого элемента преобразуется в false;любое другое значение преобразуется в true.Значение типа std::nullptr_t может быть преобразовано в значение типа bool;результирующее значение равно false.

. Сложив их вместе, 2.5f является ненулевым значением и, следовательно, будет иметь значение true, которое при отрицании будет оцениваться как false.Т.е. !a == false.


Относительно C, цитирование C99 §6.5.3.3 / 5:

Результат оператора логического отрицания ! равно 0, если значение его операнда сравнивается с 0, 1, если значение его операнда сравнивается равным 0.Результат имеет тип int.Выражение !E эквивалентно (0==E).

Т.е. чистый результат такой же, как и в C ++, за исключением типа.

8 голосов
/ 23 марта 2012

С здесь

Число с плавающей точкой будет преобразовано в false, если оно точно равно 0,0f,
Это также будет верно, если оно не равно 0,0f!также будет преобразован в истину.

0 голосов
/ 23 марта 2012

Убедитесь сами:

#include <iostream>

int main()
{
   float a = 2.5;

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

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