Подтвердить что ты не робот

Почему оператор дополнения не работает, когда 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
4b9b3361

Ответ 1

Это связано с механической механизацией оператора (также напоминающим, что ~ является поразрядным дополнением). Интегральные операнды до ~ продвигаются до int перед выполнением операции, а затем преобразуются обратно в bool. Так эффективно, что вы получаете (используя 32-разрядное представление без знака) false00xFFFFFFFFtrue. Тогда true10xFFFFFFFE1true.

Вы ищете оператора ! для инвертирования логического значения.

Ответ 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

Вы должны использовать логические операторы, а не двоичные. Используйте ! вместо ~.