Является ли x & = y эквивалентом x = x && y, если оба являются c ++ bool

0

В MSVC 2010 C++ я отображаю x и y как true, а затем выполняю x & = y; в результате x как false

Я не могу повторить в отладчике. Когда я изменил на x = x && y; то результат верен, как и ожидалось.

Должен ли я изменить код или копать глубже - я поддерживаю большую систему устаревания, предназначенную для нескольких компиляторов и нескольких процессоров?

  • 2
    Возможные дубликаты Есть ли разница между && и & с bool?
  • 0
    @herohuyongtao, который на самом деле не дурак, так как ОП не получает результат, соответствующий этому.
Показать ещё 2 комментария
Теги:

2 ответа

2
Лучший ответ

& = - двоичный И. && является логическим И.

Если оба значения действительно являются bool тогда они должны работать одинаково. Но я подозреваю, что это не так.

  • 0
    Они оба определенно глупы.
  • 0
    Тогда это будет выглядеть так же (хотя технически это не так). && гарантирует, что правая сторона не будет оценена, если левая сторона оценивается как false (конечно, это не имеет значения в этом особом случае, если только y не является недопустимым объектом, и в этом случае вы увидите сбой, пытающийся получить к нему доступ используя оператор & и только 50% вероятности сбоя в противном случае).
Показать ещё 6 комментариев
-1

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

  • 1
    bool - это базовый тип
  • 0
    Хотя это требует знания правил, окружающих его, использование bool в арифметических выражениях требует небольшого привыкания. int value = (1 + is_doubled) * i; совершенно нормально (для меня, в том смысле, что у меня нет предпочтения читать этот или троичный оператор) или даже switch(4 * bool1 + 2 * bool2 + bool3){...} для обработки нескольких различных логических выражений, где каждая комбинация определяет, что делать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню