Я предполагаю, что это просто возвращает int. Что-то еще происходит, о чем я должен знать? Различия в C/С++?
float a = 2.5;
!a; // What does this return? Int? Float?
Я предполагаю, что это просто возвращает int. Что-то еще происходит, о чем я должен знать? Различия в C/С++?
float a = 2.5;
!a; // What does this return? Int? Float?
Относительно С++, цитируя С++ 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.
Смотрите сами:
#include <iostream>
int main()
{
float a = 2.5;
if ( !a )
std::cout << !a << "\n";
else
std::cout << !a << "\n";
}