Пример:
Мы обнаружили, что это какой-то письменный код производителя, и мы пытаемся выяснить, почему они это сделают.
bool tmp = false;
if (somecase)
tmp = true;
if (someOtherCase)
tmp |= true;
Пример:
Мы обнаружили, что это какой-то письменный код производителя, и мы пытаемся выяснить, почему они это сделают.
bool tmp = false;
if (somecase)
tmp = true;
if (someOtherCase)
tmp |= true;
Нет никакой веской причины. Булево значение |= true
всегда будет true
. Это кто-то пытается вообразить или забыть логическую логику =)
Измените его на tmp = true;
.
Возможно, одним из булевых литералов была переменная, и они просто не думали менять оператор, когда они меняли операнд. Очевидно, что логика эквивалентна.
Скорее всего, они думали, что во втором случае они хотят сохранить результат оценки первого условия "если". Конечно, это ложное рассуждение.
Более простой эквивалентный оператор:
bool tmp = somecase | someOtherCase;
ИЗМЕНИТЬ
Как отмечает pickypg, это утверждение может сбивать с толку, так как большинство людей не ожидают |
с булевыми значениями, и многие его не заметят, или не будут думать о последствиях для побочных эффектов. Лучший способ быть явным (если действительно есть побочные эффекты) - это решение minitech: просто измените значение |=
на =
.
Или, если побочных эффектов для выражения someOtherCase
нет, используйте решение Jakub Konecki: someCase || someOtherCase
.
Интересно - похоже, что он делает эквивалент:
tmp = tmp | true;
который всегда устанавливает tmp в true.
foo |= true
- короткая версия foo = foo | true
.
Фактический код можно переписать как
bool tmp = false;
tmp |= someCase;
tmp |= someOtherCase;
Или даже лучше, чем
someCase || someOtherCase
Как и другие операторы op =, x |= y
эквивалентен (кроме побочных эффектов с множественной оценкой) до x = x | y
. Это сложный способ записи if (!x) x = y;
или if (y) x = true;
.
Однако, нет смысла иметь константу в правой части.
x |= true
более просто записывается как x = true
x |= false
оставляет x
неизменным.почему они это сделают.
Некоторые возможные объяснения:
tmp = true;
вместо tmp |= true;
, но никогда не замечали этого, потому что их программа работала так, как ожидалось.true
без изменения кода.tmp
изначально был bitfield (для которого |=
имеет больше смысла), который позже был сведен к одному биту.Конечным результатом будет "Если любой из случаев истинен, результат будет правдой". Нет никаких оснований полагать, что вам нужно использовать оператор, поскольку ||
в if
будет работать так же хорошо.
Умный компилятор мог бы избежать назначения в этом случае, хотя, вероятно, это не так, как если бы он не прерывал побитную операцию. В любом случае это похоже на микро-оптимизацию. На самом деле я подозреваю, что это шаблон удержания, который автор использует от битовых флагов (или он/она просто не понимает, как он работает). Было бы лучше:
bool tmp = somecase || someOthercase;
(а затем введите временное, если вы используете его только один раз)
Обратите внимание, что при использовании флагов это имеет смысл.
#define CONDITION_ONE 0x01
#define CONDITION_TWO 0x02
int temp = 0;
if (somecase) {
temp = CONDITION_ONE;
}
if (someOthercase) {
temp |= CONDITION_TWO;
}
Это эквивалентно
tmp = tmp | true;
EDIT: Который равен
tmp = true;
Я согласен с остальными плакатами здесь...!
Дополнительная информация здесь
Это выражение, использующее оператор | = присваивания. Проверьте MSDN
для bools не так много
однако для бит-флагов это может сделать такой код:
int flags=0;
flags|=READ;
//flags|=UPDATE;
foo(arg,flags);
это позволяет легко комментировать некоторые флаги (и делает используемые флаги более читаемыми IMO)