Почему оператор дополнения не работает, когда bool = true?
Я написал эту программу на С++, и я не могу понять, почему в третьем выражении cout
она печатает 1
.
#include<iostream>
using namespace std;
int main()
{
bool b = false;
cout << b << "\n"; // Print 0
b = ~b;
cout << b << "\n"; // Print 1
b = ~b;
cout << b << "\n"; // Print 1 **Why?**
return 0;
}
Вывод:
0
1
1
Почему это не печатает
0
1
0
Ответы
Ответ 1
Это связано с механической механизацией оператора (также напоминающим, что ~
является поразрядным дополнением). Интегральные операнды до ~
продвигаются до int перед выполнением операции, а затем преобразуются обратно в bool
. Так эффективно, что вы получаете (используя 32-разрядное представление без знака) false
→ 0
→ 0xFFFFFFFF
→ true
. Тогда true
→ 1
→ 0xFFFFFFFE
→ 1
→ true
.
Вы ищете оператора !
для инвертирования логического значения.
Ответ 2
Возможно, вы захотите сделать это:
b = !b;
что является логическим отрицанием. Вы сделали побитное отрицание приведения bool
к целому числу. Во второй раз, когда выполняется оператор b = ~b;
, предыдущее значение b
равно true
. Передача в целое число дает 1
, побитовое дополнение которого -2
и, следовательно, отбрасывается в bool true
. Поэтому true
значения b
останутся true
, а false
будут назначены значения true
. Это связано с наследием C.
Ответ 3
Как почти все говорят, bool получает повышение до целого числа до того, как оператор дополнения выполняет свою работу. ~ является поразрядным оператором и, таким образом, инвертирует каждый отдельный бит целого числа; если вы примените ~ к 00000001, результатом будет 11111110. Когда вы примените это к 32-разрядному значению целого числа, ~ 1 даст вам -2. Если вы запутались, просто взгляните на бинарный конвертер. Например: http://www.binaryconvert.com/result_signed_int.html?decimal=045050
К вашему пересмотренному вопросу:
False to true работает по той же причине, что и выше. Если вы переверните 00000000 (до 32 бит), вы получите 11111111... который, я считаю, равен -1 в целочисленном размере. При сравнении булевых значений все, что есть -not-0, считается истинным, а 0 - ложным.
Ответ 4
Вы должны использовать логические операторы, а не двоичные. Используйте !
вместо ~
.