Подтвердить что ты не робот

Что происходит, когда вы не логически не плаваете?

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

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

Ответ 1

Относительно С++, цитируя С++ 11 §5.3.1/9:

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

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

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

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


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

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

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

Ответ 2

От здесь

Поплавок будет преобразован в false, если его точно 0.0f,
Это также будет верно, если его не будет более резким 0.0f!
Inifinity также будет преобразовано в true.

Ответ 3

Смотрите сами:

#include <iostream>

int main()
{
   float a = 2.5;

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

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