Что происходит, когда вы не логически не плаваете?
Я предполагаю, что это просто возвращает int. Что-то еще происходит, о чем я должен знать? Различия в C/С++?
float a = 2.5;
!a; // What does this return? Int? Float?
Ответ 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).
т.е. чистый результат такой же, как у С++, за исключением типа.
Поплавок будет преобразован в 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";
}