В MSVC 2010 C++ я отображаю x и y как true, а затем выполняю x & = y; в результате x как false
Я не могу повторить в отладчике. Когда я изменил на x = x && y; то результат верен, как и ожидалось.
Должен ли я изменить код или копать глубже - я поддерживаю большую систему устаревания, предназначенную для нескольких компиляторов и нескольких процессоров?
& = - двоичный И. && является логическим И.
Если оба значения действительно являются bool
тогда они должны работать одинаково. Но я подозреваю, что это не так.
&&
гарантирует, что правая сторона не будет оценена, если левая сторона оценивается как false
(конечно, это не имеет значения в этом особом случае, если только y
не является недопустимым объектом, и в этом случае вы увидите сбой, пытающийся получить к нему доступ используя оператор &
и только 50% вероятности сбоя в противном случае).
bool
не является основным типом.Как правило, он полагается на int
или char
с 1 как true
и 0 как false
, но это не стандарт ".
Если x и y оба являются bool
, побитовое AND (&) и логическое AND (&&) приведет к тому же результату с этой реализацией. Однако MSVC просто говорит, что:
!false == true
!true == false
Таким образом, у вас могут быть разные результаты. Это плохая конструкция с использованием побитовых операторов с булевыми. Например, при C4800
int
в bool
будет генерироваться предупреждение C4800
(MSVC). Проблема в том, что преобразование из bool
в int
всегда подразумевается, и вам разрешено использовать на них любой арифметический оператор.
auto s = true + true + true; // = 3
// std::is_same<decltype(s), int>::value is True
Изменить: mea culpa
bool
- это базовый тип
bool
в арифметических выражениях требует небольшого привыкания. int value = (1 + is_doubled) * i;
совершенно нормально (для меня, в том смысле, что у меня нет предпочтения читать этот или троичный оператор) или даже switch(4 * bool1 + 2 * bool2 + bool3){...}
для обработки нескольких различных логических выражений, где каждая комбинация определяет, что делать.