Я написал эту программу на 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
Это связано с устаревшей механизацией оператора C (также напоминая, что ~
является побитовое дополнение). Интегральные операнды к ~
перед выполнением операции повышаются до int, затем преобразуются обратно в bool
, Так эффективно то, что вы получаете (используя 32-битное представление без знака) false
-> 0
-> 0xFFFFFFFF
-> true
, затем true
-> 1
-> 0xFFFFFFFE
-> 1
-> true
,
Вы ищете !
Оператор для инвертирования логического значения.
Как и почти все остальные, bool переводится в целое число, прежде чем оператор дополнения завершит свою работу. ~ является побитовым оператором и, таким образом, инвертирует каждый отдельный бит целого числа; если вы примените ~ к 00000001, результат будет 11111110. Когда вы примените это к 32-разрядному целому числу со знаком, ~ 1 даст вам -2. Если вы не уверены, почему, просто взгляните на двоичный преобразователь. Например: http://www.binaryconvert.com/result_signed_int.html?decimal=045050
На ваш исправленный вопрос:
Ложь к истине работает по той же причине, что и выше. Если вы перевернете 00000000 (до 32 бит), вы получите 11111111 … который, я считаю, равен целому числу -1. При сравнении логических значений все, что является -не-0, считается истинным, а только 0 — ложным.
Вы, вероятно, хотите сделать это:
b = !b;
что является логическим отрицанием. То, что вы сделали, это побитовое отрицание bool
приведение к целому числу. Второй раз заявление b = ~b;
выполняется, предшествующее значение b
является true
, Приведение к целому числу это дает 1
чье побитовое дополнение -2
и, следовательно, откинуть назад к бул true
, Следовательно, true
значения b
останется true
в то время как false
значения будут назначены true
, Это связано с наследием C.
Вы должны использовать логические операторы, а не бинарные операторы. использование !
вместо ~
,