Ответ 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)
.
т.е. чистый результат такой же, как у С++, за исключением типа.