ฉันใช้เสมอ||
(สองท่อ) ในการแสดงออกหรือทั้งสองใน C # และ PHP |
บางครั้งผมเห็นท่อเดียวที่ใช้: ความแตกต่างระหว่างประเพณีสองอย่างนี้คืออะไร? มีข้อแม้ใดบ้างเมื่อใช้อีกอันหนึ่งหรือใช้แทนกันได้หรือไม่?
ฉันใช้เสมอ||
(สองท่อ) ในการแสดงออกหรือทั้งสองใน C # และ PHP |
บางครั้งผมเห็นท่อเดียวที่ใช้: ความแตกต่างระหว่างประเพณีสองอย่างนี้คืออะไร? มีข้อแม้ใดบ้างเมื่อใช้อีกอันหนึ่งหรือใช้แทนกันได้หรือไม่?
คำตอบ:
เช่นเดียวกับ&
และ&&
ผู้ปฏิบัติงานตัวดำเนินการคู่คือตัวดำเนินการ "ลัดวงจร"
ตัวอย่างเช่น:
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 การดำเนินงาน
&
และ|
ในฐานะผู้ดำเนินการตามเงื่อนไขคือแฮ็คและจะทำให้พวกเขาเดือดร้อนหากพวกเขาต้องการใช้ C / C ++: 1 && 2
เป็นจริงในขณะที่1 & 2
เป็นเท็จ
&
ในการถ่ายทอดความหมายอื่น ๆ นอกเหนือจากสิ่งที่มันมักจะหมายถึงค่าที่เหมาะสมและ)
|| เป็นตัวดำเนินการ 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
หวังว่ามันสมเหตุสมผล
ดังนั้นเพื่อตอบคำถามสองข้อสุดท้ายฉันจะไม่พูดว่ามีคำเตือนใด ๆ นอกจาก "รู้ถึงความแตกต่างระหว่างผู้ให้บริการทั้งสอง" พวกเขาไม่สามารถแลกเปลี่ยนกันได้เพราะพวกเขาทำสองสิ่งที่แตกต่างอย่างสิ้นเชิง
หนึ่งคือ "bitwise หรือ"
10011b | 01000b => 11011b
ส่วนอีกอันนั้นเป็นตรรกะหรือ
true หรือ false => true
|
สามารถใช้กับbool
ประเภทได้เช่นกันโดยไม่มีการลัดวงจร
คำถามที่ดี. ตัวดำเนินการทั้งสองนี้ทำงานเหมือนกันใน 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 | เงื่อนไข 2): ตรวจสอบทั้งสองกรณีแม้ว่ากรณีที่ 1 เป็นจริง
|| - (เงื่อนไข 1 || เงื่อนไข 2): ไม่สนใจตรวจสอบกรณีที่สองถ้ากรณีแรกเป็นจริง
|| - ตัวดำเนินการจะทำให้โค้ดของคุณทำงานเร็วขึ้นอย่างมืออาชีพ | ไม่ค่อยได้ใช้
rarely used
? ทั้งหมดขึ้นอยู่กับสิ่งที่คุณต้องการหรือจำเป็นต้องทำ
ไปป์เดี่ยว | เป็นหนึ่งในตัวดำเนินการระดับบิต
จาก Wikipedia:
ในตระกูลภาษาการเขียนโปรแกรม C ตัวดำเนินการระดับบิตหรือ OR คือ "|" (ท่อ). อีกครั้งตัวดำเนินการนี้จะต้องไม่สับสนกับบูลีน "ตรรกะหรือ" คู่ซึ่งถือว่าตัวถูกดำเนินการเป็นค่าบูลีนและเขียน "||" (สองท่อ)
ตามนิยามทางคณิตศาสตร์ OR และ AND เป็นตัวดำเนินการไบนารี พวกเขาตรวจสอบเงื่อนไข LHS และ RHS โดยไม่คำนึงถึงเช่นเดียวกับ | และ &.
|| และ && แก้ไขคุณสมบัติของตัวดำเนินการ OR และ AND โดยหยุดพวกเขาเมื่อไม่ปฏิบัติตามเงื่อนไข LHS
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
ท่อไหม้ "|" คือ "bitwise" หรือและควรใช้เมื่อคุณรู้ว่าคุณกำลังทำอะไรอยู่ ท่อคู่ "||" เป็นตรรกะหรือและสามารถนำมาใช้ในงบตรรกะเช่น "x == 0 || x == 1"
นี่คือตัวอย่างของ bitwise หรืออะไร: ถ้า a = 0101 และ b = 0011 ดังนั้น a | b = 0111 หากคุณกำลังจัดการกับระบบลอจิกที่ถือว่าไม่เป็นศูนย์ใด ๆ จากนั้น bitwise หรือจะทำในลักษณะเดียวกับตรรกะหรือ แต่มันเป็นคู่ (bitwise และ "&") จะไม่ อีกทั้งค่าที่เหมาะสมหรือไม่ทำการประเมินการลัดวงจร
bool
ประเภทโดยไม่ต้องลัดวงจร
ท่อเดียว (|) เป็นค่าที่เหมาะสมหรือผู้ประกอบการ
Two pipes (||) เป็นตัวดำเนินการ OR
พวกเขาไม่สามารถใช้แทนกันได้