| оператор против || оператор - PullRequest
6 голосов
/ 05 сентября 2010

Простой вопрос, но что делает оператор | в отличие от оператора || (или)?

Ответы [ 5 ]

11 голосов
/ 05 сентября 2010

| - побитовый оператор OR, где || - логический оператор OR.А именно, первый используется для «объединения» битов из двух числовых значений в виде объединения, тогда как последний оценивается как «истина», если какое-либо условие в левой или правой части оператора является истинным.

В частности, поразряднооператоры ( не , которые следует путать с логическими операторами) работают с каждым битом чисел (в той же порядковой позиции) и соответственно вычисляют результат.В случае побитового OR результирующий бит равен 1, если любой бит равен 1, и 0 только, если оба бита равны 0. Например, 1 | 2 = 3, потому что:

1 = 0001
2 = 0010
--------
    0011 = 3

Кроме того, 2 | 3 = 3, потому что:

2 = 0010
3 = 0011
--------
    0011 = 3

Поначалу это может показаться запутанным, но в конечном итоге вы это понимаете.Побитовый OR используется в основном для установки флагов в битовом поле.То есть значение, содержащее состояние включения / выключения для набора связанных условий в одном значении (обычно 32-разрядное число).В Win32 значение стиля окна является хорошим примером битового поля, где каждый стиль представлен одним битом (или флагом), например WS_CAPTION, который указывает, имеет ли окно строку заголовка.

3 голосов
/ 05 сентября 2010

В слове есть несколько (обычно 32, 16, 8 или 64) битов.Побитовое ИЛИ (одна вертикальная черта) возвращает логическое ИЛИ для каждого положения бита в этой позиции бита.Логическое ИЛИ (две вертикальные черты) возвращает только ИСТИНА или ЛОЖЬ.

2 голосов
/ 05 сентября 2010

Как уже упоминалось, | - это битовый оператор ИЛИ, а || - логический ИЛИ, и они являются концептуально различными операциями, над которыми (обычно) работают различные виды входов. Но тогда может возникнуть другой вопрос: если бы вы использовали | с булевыми операндами, разве это не сделало бы то же самое, что и ||, поскольку в конечном итоге все сводилось к битам? Требуется ли отдельный оператор ||?

Помимо концептуального различия, другое важное отличие состоит в том, что || является короткозамкнутым . Это означает, что если первый операнд имеет значение true, второй операнд вообще не оценивается. Например:

int flag = Foo() || Bar();

вызовет Bar(), только если Foo() вернет 0. Если использовалось |, оба операнда всегда будут оцениваться.

(И, конечно, & и && ведут себя аналогичным образом.)

2 голосов
/ 05 сентября 2010

| - оператор побитовый или . Страница википедии Операторы в C и C ++ очень хорошо описывают все операторы.

0 голосов
/ 05 сентября 2010

||логично или и |является побитовым или.В большинстве случаев, когда вы проверяете такие вещи, как (i == 0 || i == 1), вы просто хотите использовать ||но когда вы делаете такие вещи, как передача флагов в качестве переменной, используйте |.(Если вы не знаете, что это, вам, вероятно, не нужно | вообще)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...