В чем разница между | и || или операторы?

Я всегда использовал || (два канала) в выражениях OR, как в C#, так и в PHP. Иногда я вижу, что используется только одна труба: |. В чем разница между этими двумя способами использования? Есть ли предостережения при использовании одного над другим или они взаимозаменяемы?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
326
0
144 996
12
Перейти к ответу Данный вопрос помечен как решенный

Ответы 12

Один из них - «поразрядное или».

10011b | 01000b => 11011b

Другой - логика или.

true or false => true

| может использоваться с типами bool без короткого замыкания.

juharr 21.08.2018 15:22

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

http://msdn.microsoft.com/en-us/library/kxszd0kx(VS.71).aspx

http://msdn.microsoft.com/en-us/library/6373h346(VS.71).aspx

Если вы действительно прочитали эти статьи, вы бы увидели, что они относятся к побитовым операторам.

johnc 02.03.2009 06:01

Это не то, что означает побитовое.

juharr 21.08.2018 15:23

Одиночная трубка "|" является «побитовым» или и должен использоваться только тогда, когда вы знаете, что делаете. Двойная труба "||" является логическим ИЛИ и может использоваться в логических операторах, например «x == 0 || x == 1».

Вот пример побитового или: если a = 0101 и b = 0011, то a | b = 0111. Если вы имеете дело с логической системой, которая обрабатывает любое ненулевое значение как истинное, то побитовое или будет действовать так же, как логическое или, но его противоположность (побитовое и, "&") НЕ будет. Также побитовая оценка или не выполняет оценку короткого замыкания.

'|' также может использоваться с типами bool без короткого замыкания.

juharr 21.08.2018 15:24

Одиночная труба (|) - это побитовый оператор ИЛИ.

Две трубы (||) - это логический оператор ИЛИ.

Они не взаимозаменяемы.

Если вы проигнорируете поразрядную операцию, двойной канал будет ленивым вычислением, а одиночный канал будет жадным в области логических операторов.

Alex 31.10.2013 19:43

|| является логическим оператором ИЛИ. Похоже, вы в основном знаете, что это такое. Он используется в условных операторах, таких как if, while и т. д.

condition1 || condition2

Возвращает истину, если истинно условие1 ИЛИ условие2.

| - побитовый оператор ИЛИ. Он используется для работы с двумя числами. Вы смотрите на каждый бит каждого числа по отдельности, и, если один из битов равен 1 хотя бы в одном из чисел, то результирующий бит также будет равен 1. Вот несколько примеров:

A = 01010101
B = 10101010
A | B = 11111111

A = 00000001
B = 00010000
A | B = 00010001

A = 10001011
B = 00101100

A | B = 10101111

Надеюсь, это имеет смысл.

Итак, чтобы ответить на два последних вопроса, я бы не сказал, что есть какие-либо предостережения, кроме «знай разницу между двумя операторами». Они не взаимозаменяемы, потому что делают две совершенно разные вещи.

Это помогло мне понять, как кто-то использовал побитовый оператор ИЛИ для объединения фильтров в драйвере Mongodb C#. gist.github.com/a3dho3yn/…

Donny V. 16.07.2019 17:29
Ответ принят как подходящий

Подобно операторам & и &&, оператор double является оператором «короткого замыкания».

Например:

if (condition1 || condition2 || condition3)

Если условие 1 истинно, условия 2 и 3 НЕ будут проверяться.

if (condition1 | condition2 | condition3)

Это проверит условия 2 и 3, даже если 1 уже истинно. Поскольку ваши условия могут быть довольно дорогостоящими функциями, вы можете получить хороший прирост производительности, используя их.

Есть одно большое предостережение: NullReferences или аналогичные проблемы. Например:

if (class != null && class.someVar < 20)

Если class имеет значение null, оператор if остановится после того, как class != null станет ложным. Если вы используете только &, он попытается проверить class.someVar, и вы получите хороший NullReferenceException. С оператором или это может быть не такой уж большой ловушкой, поскольку маловероятно, что вы вызовете что-то плохое, но об этом следует помнить.

Однако никто никогда не использует отдельные операторы & или |, если только у вас нет проекта, в котором каждое условие является функцией, которую ОБЯЗАТЕЛЬНО нужно выполнить. Похоже на запах дизайна, но иногда (редко) это чистый способ делать что-то. Оператор & «запускает эти 3 функции, и если одна из них возвращает false, выполняет блок else», тогда как | «запускает только блок else, если ни один из них не возвращает false» - может быть полезно, но, как уже говорилось, часто это дизайнерский запах.

Однако есть и второе использование операторов | и &: Побитовые операции.

Да, я не верил в это, пока не создал консольное приложение - но Боже мой! Зачем им давать веревку, чтобы повеситься! Я ненавидел это в VB.NET - ключевые слова OrElse и AndAlso!

Jarrod Dixon 06.09.2008 12:09

Мне нравится короткое замыкание этих команд! Я использую это все время, чтобы выполнить вторую проверку только в случае успеха первой, например проверку нулевого объекта: if (myObj! = Null && myObj.resultCode == 0) Console.WriteLine ("Ура!");

joshperry 11.01.2009 23:47

Конечно, может быть, мне стоит прочитать ответ целиком, прежде чем копировать его часть!

joshperry 11.01.2009 23:48

Обучение людей использованию & и | в качестве условных операторов - это хитрость, и у них возникнут проблемы, если им когда-нибудь понадобится использовать C / C++: 1 && 2 истинно, а 1 & 2 ложно.

BlueRaja - Danny Pflughoeft 17.01.2010 05:14

Это не взлом, это официально указано для C# в Разделе 7.10.3. Логические логические операторы: «Результат x | y истинен, если x или y истинно. В противном случае результат ложный». Также см. Раздел 7.11. Условные логические операторы: «Операция x || y соответствует операции x | y, за исключением того, что y вычисляется, только если x ложно». который в дальнейшем «легализует» | как условный оператор. И люди, которые будут использовать C / C++, в любом случае столкнутся с проблемами, если будут слепо полагать, что все работает одинаково. Как сказано: Использование | в выражении if - запах дизайна, но вполне законная операция.

Michael Stum 17.01.2010 05:45

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

BlueRaja - Danny Pflughoeft 07.02.2012 05:09

Это не взлом, если он делает то, для чего был создан.

Carlos Melo 01.06.2014 01:19

@ BlueRaja-DannyPflughoeft Назвать задокументированную функцию взломом, когда в документации сказано, что она предназначена для использования, все равно, что сказать с помощью оператора switch «взлом elseif». Это инструмент в ящике для инструментов, возможно, редко используемый специальный инструмент, но тем не менее инструмент.

Gent 23.07.2014 16:23

@Gent: Правило №1 при написании программного обеспечения - сделать ваш код максимально понятным и читаемым. Если вы используете «редко используемый» синтаксис, который неправильно передает ваши намерения и сбивает с толку многих читателей, то когда есть гораздо более ясная альтернатива, это плохой код. Это взлом.

BlueRaja - Danny Pflughoeft 23.07.2014 17:01

@ BlueRaja-DannyPflughoeft, согласно этой логике, циклам do и while нет места в вашем приложении, потому что они редко используются в большинстве разработанных мной бизнес-приложений. Называя это взломом, вы навязываете свое мнение и предполагаете, что КТО-либо не имеет веских причин использовать его. ОП спросил, в чем разница и какие предостережения при ее использовании.

Gent 23.07.2014 18:30

Вы говорили о повышении производительности, которое может быть достигнуто за счет использования логических логических операторов в случае дорогостоящих функций, не могли бы вы добавить несколько слов, поскольку я понял, что условные операторы сэкономят накладные расходы, поскольку они прекращают оценку, когда результат предсказуем , но я думаю, вы имели в виду другую ситуацию ...

Jyrkka 29.08.2015 20:41

Кстати, в php | это Только - побитовый оператор. Этот ответ верен для C#, но не совсем подходит для php. В php нет логического оператора без короткого замыкания. логические операторы php

ToolmakerSteve 23.09.2016 11:39

не должен "... в то время как | выполняет 'только блок else, если ни один из них не возвращает false'" фактически быть ", в то время как | выполняет 'только блок else, если ни один из них не возвращает истинный'"?

Skeets 20.07.2019 02:44

Хороший вопрос. Эти два оператора работают одинаково в PHP и C#.

| - это побитовое ИЛИ. Он будет сравнивать два значения по их битам. Например. 1101 | 0010 = 1111. Это чрезвычайно полезно при использовании битовых параметров. Например. Чтение = 01 (0X01) Запись = 10 (0X02) Чтение-запись = 11 (0X03). Один из полезных примеров - открытие файлов. Простой пример:

File.Open(FileAccess.Read | FileAccess.Write);  //Gives read/write access to the file

|| - это логическое ИЛИ. Именно так большинство людей думают об ИЛИ и сравнивают два значения на основе их истинности. Например. Я пойду в магазин или пойду в торговый центр. Это тот, который чаще всего используется в коде. Например:

if (Name == "Admin" || Name == "Developer") { //allow access } //checks if name equals Admin OR Name equals Developer

Ресурс PHP: http://us3.php.net/language.operators.bitwise

Ресурсы C#: http://msdn.microsoft.com/en-us/library/kxszd0kx(VS.71).aspx

http://msdn.microsoft.com/en-us/library/6373h346(VS.71).aspx

FWIW, технически в C# | - это логический или при применении к булевы. Как указано в вашей связанной ссылке. На практике конечный результат такой же, как если бы это был побитовый оператор, потому что побитовые значения true и false таковы, что побитовое или их значений дает тот же результат, что и логический или. То есть (int)(bool1 | bool2) == ((int)bool1) | ((int)bool2).

ToolmakerSteve 23.09.2016 11:53

Одиночный канал | - это один из операторов побитовый.

Из Википедии:

In the C programming language family, the bitwise OR operator is "|" (pipe). Again, this operator must not be confused with its Boolean "logical or" counterpart, which treats its operands as Boolean values, and is written "||" (two pipes).

Простой пример на java

public class Driver {

  static int x;
  static int y;

public static void main(String[] args) 
throws Exception {

System.out.println("using double pipe");
    if (setX() || setY())
        {System.out.println("x = "+x);
        System.out.println("y = "+y);
        }



System.out.println("using single pipe");
if (setX() | setY())
    {System.out.println("x = "+x);
    System.out.println("y = "+y);
    }

}

 static boolean setX(){
      x=5;
     return true;
  }
 static boolean setY(){
      y=5;
      return true;
  }
}

выход :

using double pipe
x = 5
y = 0
using single pipe
x = 5
y = 5

Зачем приводить пример java для вопроса, в котором даже не упоминается java?

juharr 21.08.2018 15:27

По математическому определению ИЛИ и И являются бинарными операторами; они проверяют условия LHS и RHS независимо, аналогично | и &.

|| и && изменяют свойства операторов OR и AND, останавливая их, когда условие LHS не выполняется.

& - (Условие 1 и Условие 2): проверяет оба случая, даже если первый неверен

&& - (Условие 1 && Условие 2): не пытайтесь проверить второй случай, если случай первый ложно

&& - оператор заставит ваш код работать быстрее, профессиональнее и редко используется

| - (Условие 1 | Условие 2): проверяет оба случая, даже если случай 1 истинен

|| - (Условие 1 || Условие 2): не пытайтесь проверить второй случай, если первый одна правда

|| - оператор заставит ваш код работать быстрее, профессионально | редко используется

rarely used? Все зависит от того, что вы хотите или должны делать.

Emaborsa 14.05.2018 15:28

Большой! Коротко и мило, я бы удалил «| редко используется» и «& редко используется», потому что, как сказал Emaborsa, это действительно зависит от того, что вы хотите или должны делать.

Iannick 28.08.2018 18:39

Для побитового | и логического ||

ИЛИ ЖЕ

побитовый & и логический &&

это значит if ( a>b | a==0) сначала слева будет оцениваться a>b, а затем a==0, затем будет выполнена операция |

но в || if a>b, если не проверять следующий RHS

Аналогично для & и &&

if (A>0 & B>0)

он будет оценивать LHS, а затем RHS, затем побитовый & но

in(A>0 && B>0)

if (A>0) - это false (LHS), он будет напрямую return false;

Другие вопросы по теме