Почему оператор дополнения не работает, когда bool = true?

Я написал эту программу на C ++ и не могу понять, почему она печатает 1 в третьем cout заявление.

#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

18

Решение

Это связано с устаревшей механизацией оператора C (также напоминая, что ~ является побитовое дополнение). Интегральные операнды к ~ перед выполнением операции повышаются до int, затем преобразуются обратно в bool, Так эффективно то, что вы получаете (используя 32-битное представление без знака) false -> 0 -> 0xFFFFFFFF -> true, затем true -> 1 -> 0xFFFFFFFE -> 1 -> true,

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

24

Другие решения

Как и почти все остальные, bool переводится в целое число, прежде чем оператор дополнения завершит свою работу. ~ является побитовым оператором и, таким образом, инвертирует каждый отдельный бит целого числа; если вы примените ~ к 00000001, результат будет 11111110. Когда вы примените это к 32-разрядному целому числу со знаком, ~ 1 даст вам -2. Если вы не уверены, почему, просто взгляните на двоичный преобразователь. Например: http://www.binaryconvert.com/result_signed_int.html?decimal=045050

На ваш исправленный вопрос:

Ложь к истине работает по той же причине, что и выше. Если вы перевернете 00000000 (до 32 бит), вы получите 11111111 … который, я считаю, равен целому числу -1. При сравнении логических значений все, что является -не-0, считается истинным, а только 0 — ложным.

6

Вы, вероятно, хотите сделать это:

b = !b;

что является логическим отрицанием. То, что вы сделали, это побитовое отрицание bool приведение к целому числу. Второй раз заявление b = ~b; выполняется, предшествующее значение b является true, Приведение к целому числу это дает 1 чье побитовое дополнение -2 и, следовательно, откинуть назад к бул true, Следовательно, true значения b останется true в то время как false значения будут назначены true, Это связано с наследием C.

5

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

2
По вопросам рекламы [email protected]