Да. Для целочисленных типов !
возвращает true
, если операнд равен нулю, и false
в противном случае.
Так что !b
здесь означает просто b == 0
.
Это частный случай, когда значение преобразуется в bool
. !b
можно рассматривать как !((bool)b)
, поэтому вопрос в том, что такое «истинность» b
. В C ++ арифметические типы, типы указателей и enum могут быть преобразованы в bool
. Когда значение равно 0 или равно нулю, результат равен false
, в противном случае он равен true
(C ++ §4.1.2).
Конечно, пользовательские классы могут даже перегружать типы operator!
или operator
<<em>, их можно преобразовать в bool >, чтобы разрешить !b
для своих классов. Например, std::stream
перегружает operator!
и operator void*
для проверки битов сбоя, так что такие идиомы, как
while (std::cin >> x) { // <-- conversion to bool needed here
...
можно использовать.
(Но ваш код !( a > b && b <= c) || a > c && !b
просто загадочный.)