Я предполагаю, что это просто возвращает 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";
}