ความแตกต่างระหว่าง | คืออะไร และ || หรือผู้ประกอบการ


300

ฉันใช้เสมอ||(สองท่อ) ในการแสดงออกหรือทั้งสองใน C # และ PHP |บางครั้งผมเห็นท่อเดียวที่ใช้: ความแตกต่างระหว่างประเพณีสองอย่างนี้คืออะไร? มีข้อแม้ใดบ้างเมื่อใช้อีกอันหนึ่งหรือใช้แทนกันได้หรือไม่?

คำตอบ:


488

เช่นเดียวกับ&และ&&ผู้ปฏิบัติงานตัวดำเนินการคู่คือตัวดำเนินการ "ลัดวงจร"

ตัวอย่างเช่น:

if(condition1 || condition2 || condition3)

หาก condition1 เป็นจริงเงื่อนไข 2 และ 3 จะไม่ถูกตรวจสอบ

if(condition1 | condition2 | condition3)

สิ่งนี้จะตรวจสอบเงื่อนไข 2 และ 3 แม้ว่า 1 เป็นจริงแล้ว เนื่องจากเงื่อนไขของคุณอาจเป็นฟังก์ชั่นที่ค่อนข้างแพงคุณสามารถเพิ่มประสิทธิภาพที่ดีได้โดยการใช้งาน

มีข้อแม้ใหญ่หนึ่งข้อ NullReferences หรือปัญหาที่คล้ายกัน ตัวอย่างเช่น:

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

หากคลาสเป็นโมฆะคำสั่ง if-stop จะหยุดหลังจากนั้นclass != nullเป็นเท็จ ถ้าคุณใช้เฉพาะและก็จะพยายามที่จะตรวจสอบและคุณได้รับที่ดีclass.someVar NullReferenceExceptionด้วย Or-Operator ที่อาจไม่เป็นกับดักมากนักเพราะมันไม่น่าเป็นไปได้ที่คุณจะเรียกสิ่งที่ไม่ดี แต่มันเป็นสิ่งที่ต้องคำนึงถึง

ไม่มีใครเคยใช้ซิงเกิ้ล&หรือ|โอเปอเรเตอร์แม้ว่าคุณจะมีการออกแบบโดยที่แต่ละเงื่อนไขนั้นเป็นฟังก์ชั่นที่จะใช้งาน HAS ฟังดูเหมือนกลิ่นการออกแบบ แต่บางครั้ง (ไม่ค่อย) มันเป็นวิธีที่สะอาดในการทำสิ่งต่างๆ &ผู้ประกอบการไม่ "ทำงานทั้ง 3 ฟังก์ชั่นและถ้าหนึ่งของพวกเขากลับเท็จรันบล็อกอื่น" ในขณะที่|ไม่ "เท่านั้นเรียกใช้บล็อกอื่นถ้าไม่มีผลตอบแทนที่เป็นเท็จ" - จะมีประโยชน์ แต่เป็นกล่าวมักจะเป็นการออกแบบ กลิ่น.

มีการใช้งานที่สองของเป็น|และ&ผู้ประกอบการว่า: Bitwise การดำเนินงาน


9
ใช่ฉันไม่เชื่อจนกว่าฉันจะสร้างแอปคอนโซล - แต่ท่านก็ดี! ทำไมพวกเขาถึงเอาเชือกมาให้คุณ! ฉันเกลียดที่เกี่ยวกับ VB.NET - คำหลัก OrElse และ AndAlso!
Jarrod Dixon

24
การสอนผู้ใช้ให้ใช้งาน&และ|ในฐานะผู้ดำเนินการตามเงื่อนไขคือแฮ็คและจะทำให้พวกเขาเดือดร้อนหากพวกเขาต้องการใช้ C / C ++: 1 && 2เป็นจริงในขณะที่1 & 2เป็นเท็จ
BlueRaja - Danny Pflughoeft

47
ไม่ใช่แฮ็คมันถูกระบุอย่างเป็นทางการสำหรับ C # ในหัวข้อ 7.10.3 ตัวดำเนินการเชิงตรรกะบูลีน: "ผลลัพธ์ของ x | y เป็นจริงถ้า x หรือ y เป็นจริงมิฉะนั้นผลลัพธ์จะเป็นเท็จ" ดูที่หัวข้อ 7.11 ตัวดำเนินการเชิงตรรกะแบบมีเงื่อนไข: "การดำเนินการ x || y สอดคล้องกับการดำเนินการ x | y ยกเว้นว่า y ได้รับการประเมินเฉพาะเมื่อ x เป็นเท็จ" ซึ่งเพิ่มเติม "legalizes" | ในฐานะผู้ประกอบการตามเงื่อนไข และคนที่จะใช้ C / C ++ จะมีปัญหาอยู่แล้วถ้าพวกเขาเพียงแค่คิดว่าสิ่งที่ทำงานอย่างเท่าเทียมกัน ดังที่ได้กล่าวไว้: การใช้ | ในคำสั่ง if เป็นกลิ่นการออกแบบ แต่การดำเนินการทางกฎหมายที่สมบูรณ์แบบ
Michael Stum

9
ฉันไม่เคยบอกว่ามันเป็นไม่ได้ตามกฎหมายเพียงว่ามันเป็นสับซึ่งมันเป็น(คุณใช้&ในการถ่ายทอดความหมายอื่น ๆ นอกเหนือจากสิ่งที่มันมักจะหมายถึงค่าที่เหมาะสมและ)
BlueRaja - Danny Pflughoeft

15
@ BlueRaja-DannyPflughoeft การเรียกฟีเจอร์ที่ทำเป็นเอกสารแฮ็คเมื่อเอกสารบอกว่ามันตั้งใจจะใช้ก็เหมือนกับการใช้คำสั่งสวิตช์ "การแฮ็กอื่น" มันเป็นเครื่องมือในกล่องเครื่องมือซึ่งเป็นเครื่องมือพิเศษที่ไม่ค่อยได้ใช้ แต่อาจเป็นเครื่องมือที่ไม่ได้น้อย
Gent

80

|| เป็นตัวดำเนินการ OR เชิงตรรกะ ดูเหมือนคุณจะรู้ว่ามันคืออะไร มันใช้ในงบตามเงื่อนไขเช่นถ้าในขณะที่ ฯลฯ

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

หวังว่ามันสมเหตุสมผล

ดังนั้นเพื่อตอบคำถามสองข้อสุดท้ายฉันจะไม่พูดว่ามีคำเตือนใด ๆ นอกจาก "รู้ถึงความแตกต่างระหว่างผู้ให้บริการทั้งสอง" พวกเขาไม่สามารถแลกเปลี่ยนกันได้เพราะพวกเขาทำสองสิ่งที่แตกต่างอย่างสิ้นเชิง


สิ่งนี้ช่วยให้ฉันเข้าใจว่ามีคนใช้ตัวดำเนินการบิตหรือ OR ในการผสานตัวกรองในไดรเวอร์ Mongodb C # gist.github.com/a3dho3yn/…
Donny V.

30

หนึ่งคือ "bitwise หรือ"

10011b | 01000b => 11011b

ส่วนอีกอันนั้นเป็นตรรกะหรือ

true หรือ false => true


2
|สามารถใช้กับboolประเภทได้เช่นกันโดยไม่มีการลัดวงจร
juharr

14

คำถามที่ดี. ตัวดำเนินการทั้งสองนี้ทำงานเหมือนกันใน 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


4
FWIW เทคนิคใน C # |เป็นตรรกะหรือเมื่อนำไปใช้กับบูลีน เป็นสถานะอ้างอิงที่เชื่อมโยงของคุณ ในทางปฏิบัติผลลัพธ์สุดท้ายนั้นเหมือนกับว่ามันเป็นตัวดำเนินการระดับบิตเนื่องจากค่าระดับบิตของtrueและfalseเป็นเช่นนั้นค่าระดับบิตหรือของค่าของพวกเขาสร้างผลลัพธ์ที่แน่นอนเช่นเดียวกับตรรกะหรือไม่ นั่นคือ==(int)(bool1 | bool2) ((int)bool1) | ((int)bool2)
ToolmakerSteve

4

ตัวอย่างง่ายๆใน 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

2
ทำไมคุณต้องยกตัวอย่างจาวาสำหรับคำถามที่ไม่ได้พูดถึงจาวา
juharr

4

& - (เงื่อนไข 1 และเงื่อนไข 2): ตรวจสอบทั้งสองกรณีแม้ว่ากรณีแรกจะเป็นเท็จ

&& - (เงื่อนไข 1 && เงื่อนไข 2): ไม่สนใจตรวจสอบกรณีที่สองหากกรณีหนึ่งเป็นเท็จ

&& - โอเปอเรเตอร์จะทำให้โค้ดของคุณทำงานเร็วขึ้นอย่างมืออาชีพ & ไม่ค่อยได้ใช้

| - (เงื่อนไข 1 | เงื่อนไข 2): ตรวจสอบทั้งสองกรณีแม้ว่ากรณีที่ 1 เป็นจริง

|| - (เงื่อนไข 1 || เงื่อนไข 2): ไม่สนใจตรวจสอบกรณีที่สองถ้ากรณีแรกเป็นจริง

|| - ตัวดำเนินการจะทำให้โค้ดของคุณทำงานเร็วขึ้นอย่างมืออาชีพ | ไม่ค่อยได้ใช้


2
rarely used? ทั้งหมดขึ้นอยู่กับสิ่งที่คุณต้องการหรือจำเป็นต้องทำ
Emaborsa

1
ที่ดี! สั้นและหวานฉันจะลบ "| ไม่ค่อยได้ใช้" และ "& ไม่ค่อยได้ใช้" เพราะอย่างที่ Emaborsa กล่าวมันขึ้นอยู่กับสิ่งที่คุณต้องการหรือจำเป็นต้องทำ
Iannick

0

ไปป์เดี่ยว | เป็นหนึ่งในตัวดำเนินการระดับบิต

จาก Wikipedia:

ในตระกูลภาษาการเขียนโปรแกรม C ตัวดำเนินการระดับบิตหรือ OR คือ "|" (ท่อ). อีกครั้งตัวดำเนินการนี้จะต้องไม่สับสนกับบูลีน "ตรรกะหรือ" คู่ซึ่งถือว่าตัวถูกดำเนินการเป็นค่าบูลีนและเขียน "||" (สองท่อ)


0

ตามนิยามทางคณิตศาสตร์ OR และ AND เป็นตัวดำเนินการไบนารี พวกเขาตรวจสอบเงื่อนไข LHS และ RHS โดยไม่คำนึงถึงเช่นเดียวกับ | และ &.

|| และ && แก้ไขคุณสมบัติของตัวดำเนินการ OR และ AND โดยหยุดพวกเขาเมื่อไม่ปฏิบัติตามเงื่อนไข LHS


-1

The | ตัวดำเนินการดำเนินการ bitwise OR ของตัวถูกดำเนินการสองตัว (หมายถึงทั้งสองฝ่ายต้องประเมินค่าเป็นเท็จเพื่อให้ตัวดำเนินการคืนค่าเท็จ) ขณะที่ | | ผู้ประกอบการจะประเมินผู้ประกอบการที่สองเท่านั้นหากจำเป็นต้อง

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

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


ถ้าคุณจริงอ่านบทความที่คุณจะได้เห็นว่าพวกเขาจะหมายถึงผู้ประกอบการระดับบิต
johnc

นั่นไม่ใช่ความหมายในระดับบิต
juharr

-1

ท่อไหม้ "|" คือ "bitwise" หรือและควรใช้เมื่อคุณรู้ว่าคุณกำลังทำอะไรอยู่ ท่อคู่ "||" เป็นตรรกะหรือและสามารถนำมาใช้ในงบตรรกะเช่น "x == 0 || x == 1"

นี่คือตัวอย่างของ bitwise หรืออะไร: ถ้า a = 0101 และ b = 0011 ดังนั้น a | b = 0111 หากคุณกำลังจัดการกับระบบลอจิกที่ถือว่าไม่เป็นศูนย์ใด ๆ จากนั้น bitwise หรือจะทำในลักษณะเดียวกับตรรกะหรือ แต่มันเป็นคู่ (bitwise และ "&") จะไม่ อีกทั้งค่าที่เหมาะสมหรือไม่ทำการประเมินการลัดวงจร


'|' ยังสามารถใช้กับboolประเภทโดยไม่ต้องลัดวงจร
juharr

-2

ท่อเดียว (|) เป็นค่าที่เหมาะสมหรือผู้ประกอบการ

Two pipes (||) เป็นตัวดำเนินการ OR

พวกเขาไม่สามารถใช้แทนกันได้


1
หากคุณเพิกเฉยต่อการดำเนินการระดับบิตสองครั้งคือการประเมินผลแบบขี้เกียจและไปป์เดียวนั้นเป็นโลภภายในพื้นที่ตัวดำเนินการเชิงตรรกะ
Alex
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.