Это мой код:
#include <cstring>
#include <iostream>
int main() {
bool a;
memset(&a, 0x03, sizeof(bool));
if (a) {
std::cout << "a is true!" << std::endl;
}
if (!a) {
std::cout << "!a is true!" << std::endl;
}
}
Он выводит:
a is true!
!a is true!
Кажется, что оператор !
на bool
инвертирует только последний бит, но каждое значение, не равное 0
, рассматривается как true
. Это приводит к показанному поведению, которое логически неверно. Это ошибка в реализации, или это позволяет спецификация? Обратите внимание, что memset
можно опустить, и поведение, вероятно, будет таким же, поскольку a
содержит мусор памяти.
Я на gcc 4.4.5, другие компиляторы могут сделать это по-другому.