оператор "| =" в c ++ - PullRequest
       75

оператор "| =" в c ++

2 голосов
/ 26 сентября 2011

У меня вопрос по поводу "| =" в c ++, как работает этот оператор, например:

bool result;

result |= callFunctionOne(sig);
result |= callFunctionTwo(sig);
result |= callFunctionThree(sig);
result |= callFunctionFour(sig);

и вызываемая выше функция будет возвращать значение «истина», если параметр sig обрабатывается в функции; в противном случае возвращается «ложь»;

сигнал может быть обработан только в одной функции каждый раз, как работает "|="?

Ответы [ 4 ]

7 голосов
/ 26 сентября 2011

| - побитовое ИЛИ.

|= говорит, что возьмите то, что возвращается в одной из ваших функций, и bitwise OR это с помощью result, затем сохраните это в result. Это эквивалентно выполнению чего-то вроде:

result = result | callFunctionOne(sig);

Пример кода:

bool result;

result |= callFunctionOne(sig);
result |= callFunctionTwo(sig);
result |= callFunctionThree(sig);
result |= callFunctionFour(sig);

и ваша логика

будет возвращать «истина», если в функции обработан sig-параметр, в противном случае верните «ложь»;

То есть, если вы не определите результат, по умолчанию это будет FALSE .

result = false;

callFunctionOne возвращает TRUE

result = result | callFunctionOne;

result равно ИСТИНА .

result = false;

callFunctionOne возвращает FALSE

result = result | callFunctionOne

результат равен ЛОЖЬ.

Хотя может показаться, что это boolean OR, он все еще использует bitwise OR, который, по сути, OR'ing число 1 или 0.

Итак, учитывая, что 1 равно TRUE и 0 равно FALSE, запомните таблицы истинности:

p   q   p ∨ q
T   T   T
T   F   T
F   T   T
F   F   F

Теперь, поскольку вы вызываете каждую функцию за другой, это означает, что результат предыдущей функции в конечном итоге определит конечный результат из callFunctionFour. При этом, три четверти времени, это будет ИСТИНА и одна четверть времени, это будет ЛОЖЬ .

2 голосов
/ 26 сентября 2011

a |= b эквивалентно a = a | b.

1 голос
/ 26 сентября 2011

Проще говоря, true будет присвоено result, если какая-либо из этих функций вернет true, а false в противном случае. Но есть одна проблема - result должно быть initialized, в противном случае эта битовая операция будет выполняться со случайным начальным значением и может вернуть true, даже если все функции возвращают false.

Сам оператор называется "поразрядным включением" или *

0 голосов
/ 26 сентября 2011

| оператор является побитовым ИЛИ (если вы знаете логическую логику, для переменной bool он действует как логическое ИЛИ). Если один или несколько вызовов вернут истину, результат будет истинным. Если все вызовы возвращают ложь, результат ложен.

Каждый раз это эквивалент результата = результат | callFunctionXXX (сиг);

Примечание: в вашем примере кода результат переменной не инициализирован. Это должно быть "bool result = false;"

...