Відповіді:
Так само, як &
і &&
оператор, подвійний Оператор є оператором "короткого замикання".
Наприклад:
if(condition1 || condition2 || condition3)
Якщо умова1 вірна, умови 2 та 3 НЕ перевіряються.
if(condition1 | condition2 | condition3)
Це дозволить перевірити умови 2 і 3, навіть якщо 1 вже відповідає дійсності. Оскільки ваші умови можуть бути досить дорогими функціями, ви можете отримати гарне підвищення продуктивності, використовуючи їх.
Є один великий застереження, NullReferences або подібні проблеми. Наприклад:
if(class != null && class.someVar < 20)
Якщо клас недійсний, виписка if припиниться після class != null
false. Якщо ви тільки використовуєте &, він спробує перевірити, class.someVar
і ви отримаєте хороший NullReferenceException
. З Or-Operator це може бути не стільки пастки, оскільки навряд чи ви запускаєте щось погане, але це потрібно пам’ятати.
Ніхто ніколи не використовує сингл &
або |
операторів, якщо ви не маєте дизайну, де кожна умова є функцією, яку потрібно виконати. Звучить, як дизайнерський запах, але іноді (рідко) це чистий спосіб робити речі. &
Оператор не "запустити ці 3 функції, і якщо один з них повертає брехня, виконати ще блок», в той час як |
це «тільки запустити ще блок , якщо жоден повернення помилковим» - може бути корисним, але , як сказав, часто це дизайн запах.
Однак існує друге використання оператора |
та &
оператора: Побітові операції .
&
і |
як умовні оператори - це хак, і вони змусять себе мати проблеми, якщо вони коли-небудь потребують використання C / C ++: 1 && 2
це правда, а 1 & 2
неправда.
&
для передачі сенсу, відмінного від того, що це майже завжди означає: побіт-і) .
|| є логічним оператором АБО. Здається, ви в основному знаєте, що це таке. Він використовується в умовних висловлюваннях, таких як 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
Сподіваємось, це має сенс.
Отже, щоб відповісти на два останні запитання, я б не сказав, що є будь-які застереження, окрім "знайте різницю між двома операторами". Вони не взаємозамінні, оскільки роблять дві абсолютно різні речі.
Хороше питання. Ці два оператори працюють однаково у 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
|
є логічним або при застосуванні до булевих . Як вказано у вашій довідковій справі. На практиці кінцевий результат такий самий, як якщо б це був побітовий оператор, тому що побітові значення true
та false
такі, що порозрядне або їх значення дає такий же результат, як і логічний чи дійсний. Тобто (int)(bool1 | bool2)
== ((int)bool1) | ((int)bool2)
.
Простий приклад у 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
& - (Умова 1 та Умова 2): перевіряє обидва випадки, навіть якщо перший з них є помилковим
&& - (Умова 1 та & Умова 2): не намагайтеся перевіряти другий випадок, якщо випадок 1 неправдивий
&& - оператор змусить ваш код працювати швидше, професійно і його рідко використовують
| - (Умова 1 | Умова 2): перевіряє обидва випадки, навіть якщо випадок 1 є істинним
|| - (Умова 1 || Умова 2): не турбуйтеся перевіряти другий випадок, якщо перший є істинним
|| - оператор змусить ваш код працювати швидше, професійно | використовується рідко
rarely used
? Все залежить від того, що ви хочете або потрібно зробити.
Одинарна труба, |, є одним з розрядних операторів.
З Вікіпедії:
У сімействі мов програмування на C оператором бітового АБО є "|" (труба). Знову ж таки, цього оператора не слід плутати зі своїм булевим "логічним" або "аналогом", який трактує його операнди як булеві значення та пишеться "||" (дві труби).
За своїм математичним визначенням АБО та І є двійковими операторами; вони перевіряють умови LHS та RHS незалежно, як | і &.
|| та && змінювати властивості операторів OR і AND, зупиняючи їх, коли умова LHS не виконується.
| Оператор виконує побіт АБО двох своїх операндів (тобто обидві сторони повинні оцінювати значення false, щоб повернути помилкові), тоді як || Оператор оцінить другого оператора лише в тому випадку, якщо це потрібно.
http://msdn.microsoft.com/en-us/library/kxszd0kx(VS.71).aspx
http://msdn.microsoft.com/en-us/library/6373h346(VS.71).aspx
Сінг-труба "|" є "побітним" або і має використовуватися лише тоді, коли ви знаєте, що робите. Подвійна труба "||" є логічним або, і може використовуватися в логічних висловлюваннях, як "x == 0 || x == 1".
Ось приклад того, що розрядне чи дійсне: якщо a = 0101 і b = 0011, то a | b = 0111. Якщо ви маєте справу з логічною системою, яка розглядає будь-який ненульовий показник як істинний, то побітове або поступить так само, як і логічне або, але це аналог (порозрядно і "&") НЕ буде. Також розрядне або не виконує оцінку короткого замикання.
bool
типи без короткого замикання.
Одинарна труба (|) є оператором побітових АБО .
Дві труби (||) є логічним оператором АБО.
Вони не взаємозамінні.