Вы попали в тупик от целочисленного продвижения .Не совсем научное объяснение состоит в том, что для определенных операторов, если они явно не определены, C ++ будет пытаться преобразовать встроенные целочисленные типы (включая bool
) в int
.Затем это приводит к следующим результатам:
#include <iostream>
int main()
{
std::cout << std::boolalpha;
std::cout << "~: " << ~true << ", " << ~false << "\n";
std::cout << "-: " << -true << ", " << -false << "\n";
std::cout << "!: " << !true << ", " << !false << "\n";
}
напечатает
~: -2, -1
-: -1, 0
!: false, true
Обратите внимание, что !
является единственным из этих операторов, который фактически определен для bool
, тогда какдва других целочисленных преобразования (с false
, превращающимися в 0 и true
в 1).
-b^A
тогда означает «сохранить все биты одинаково, если b
равно false
,и переверните их все, если b
равно true
", тогда как ~b^A
означает" Перевернуть все биты все время, но последний только, если b
равен false
"- совершенно другая семантика!