Относительно 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 ++, за исключением типа.