คำตอบอื่น ๆ ทำได้ดีมากในการครอบคลุมความแตกต่างของหน้าที่การใช้งานระหว่างตัวดำเนินการ แต่คำตอบสามารถนำไปใช้ได้กับภาษา C ที่ได้จากภาษาเดียวในปัจจุบัน คำถามถูกแท็กด้วยชวาดังนั้นฉันจะพยายามตอบเฉพาะและทางเทคนิคสำหรับภาษาจาวา
&
และ|
สามารถเป็นผู้ประกอบการ Bitwise อย่างใดอย่างหนึ่งหรือผู้ประกอบการตรรกะบูลีน ไวยากรณ์สำหรับผู้ประกอบการบิตและตรรกะ ( §15.22 ) คือ:
AndExpression:
EqualityExpression
AndExpression & EqualityExpression
ExclusiveOrExpression:
AndExpression
ExclusiveOrExpression ^ AndExpression
InclusiveOrExpression:
ExclusiveOrExpression
InclusiveOrExpression | ExclusiveOrExpression
ไวยากรณ์สำหรับEqualityExpression
ถูกกำหนดใน§15.21ซึ่งต้องการRelationalExpression
กำหนดไว้ใน§15.20ซึ่งจำเป็นต้องมีShiftExpression
และReferenceType
กำหนดไว้ใน§15.19และ§4.3ตามลำดับ ShiftExpression
ต้องAdditiveExpression
กำหนดไว้ใน§15.18ซึ่งยังคงเจาะลึกการกำหนดเลขคณิตพื้นฐานผู้ประกอบการเอกและอื่น ๆReferenceType
เจาะลึกลงไปในทุกวิธีที่จะเป็นตัวแทนของประเภท (ในขณะที่ReferenceType
ไม่รวมถึงรูปแบบดั้งเดิมความหมายของรูปแบบดั้งเดิมจะต้องที่สุดเท่าที่พวกเขาอาจจะเป็นประเภทมิติสำหรับอาร์เรย์ซึ่งเป็นReferenceType
.)
ตัวดำเนินการบิตและตรรกะมีคุณสมบัติดังต่อไปนี้:
- ตัวดำเนินการเหล่านี้มีลำดับความสำคัญต่างกันโดย
&
มีลำดับความสำคัญสูงสุดและ|
ลำดับความสำคัญต่ำสุด
- ผู้ประกอบการเหล่านี้แต่ละรายมีความสัมพันธ์ทางซ้าย (แต่ละกลุ่มจากซ้ายไปขวา)
- ตัวดำเนินการแต่ละตัวเป็นแบบสับเปลี่ยนถ้านิพจน์ตัวถูกดำเนินการไม่มีผลข้างเคียง
- ผู้ประกอบการแต่ละคนมีความสัมพันธ์
boolean
ค่าบิตและตรรกะผู้ประกอบการอาจถูกใช้เพื่อเปรียบเทียบสองตัวถูกดำเนินการประเภทที่เป็นตัวเลขหรือสองตัวถูกดำเนินการประเภท กรณีอื่นทั้งหมดทำให้เกิดข้อผิดพลาดในการคอมไพล์
ความแตกต่างระหว่างไม่ว่าจะเป็นผู้ประกอบการที่ทำหน้าที่เป็นผู้ประกอบการระดับบิตหรือผู้ประกอบการเชิงตรรกะขึ้นอยู่กับว่าตัวถูกดำเนินการเป็น "แปลงสภาพให้แก่ชนิดหนึ่งดั้งเดิม" ( §4.2 ) หรือถ้าพวกเขาเป็นประเภทboolean
หรือBoolean
( §5.1.8 )
หากตัวถูกดำเนินการเป็นประเภทที่สมบูรณ์การส่งเสริมตัวเลขไบนารี ( §5.6.2 ) จะดำเนินการกับตัวถูกดำเนินการทั้งสองโดยปล่อยให้ตัวถูกดำเนินการทั้งสองเป็นlong
s หรือint
s สำหรับการดำเนินการ ประเภทของการดำเนินการจะเป็นประเภทของตัวถูกดำเนินการ (เลื่อนระดับ) ณ จุดนั้น&
จะเป็นระดับบิตและ^
จะเป็นระดับบิตพิเศษและ|
จะรวมระดับบิต ( §15.22.1 )
ถ้าตัวถูกดำเนินการที่มีboolean
หรือBoolean
, ตัวถูกดำเนินการจะต้องมีการแปลง unboxing หากจำเป็น ( §5.1.8 ) boolean
และประเภทของการดำเนินการจะเป็น &
จะส่งผลให้true
ถ้าทั้งสองตัวถูกดำเนินการอยู่true
, ^
จะส่งผลให้true
ถ้าทั้งสองตัวถูกดำเนินการที่แตกต่างกันและ|
จะมีผลในกรณีใดกรณีหนึ่งถูกดำเนินการคือtrue
true
( §15.22.2 )
ในทางตรงกันข้าม &&
คือ "เงื่อนไข - และผู้ดำเนินการ" ( §15.23 ) และ||
เป็น "ผู้ประกอบการตามเงื่อนไข" ( §15.24 ) ไวยากรณ์ของพวกเขาถูกกำหนดเป็น:
ConditionalAndExpression:
InclusiveOrExpression
ConditionalAndExpression && InclusiveOrExpression
ConditionalOrExpression:
ConditionalAndExpression
ConditionalOrExpression || ConditionalAndExpression
&&
เป็นเหมือนยกเว้นว่ามันจะประเมินเฉพาะตัวถูกดำเนินการที่เหมาะสมถ้าถูกดำเนินการทางด้านซ้ายคือ&
เป็นเหมือนยกเว้นว่ามันจะประเมินเฉพาะตัวถูกดำเนินการที่เหมาะสมถ้าถูกดำเนินการทางด้านซ้ายคือtrue
||
|
false
เงื่อนไข - และมีคุณสมบัติดังต่อไปนี้:
- เงื่อนไขและโอเปอเรเตอร์ถูกเชื่อมโยงทางซ้าย (สัมพันธ์กันจากซ้ายไปขวา)
- เงื่อนไขและโอเปอเรเตอร์นั้นสัมพันธ์กันอย่างสมบูรณ์เกี่ยวกับผลข้างเคียงและค่าผลลัพธ์ นั่นคือสำหรับการแสดงออกใด ๆ
a
, b
และc
การประเมินผลของการแสดงออกผลิตผลเดียวกันกับผลข้างเคียงที่เกิดขึ้นในการสั่งซื้อเช่นเดียวกับการประเมินผลของการแสดงออก((a) && (b)) && (c)
(a) && ((b) && (c))
- ตัวถูกดำเนินการแต่ละรายการของเงื่อนไขและตัวดำเนินการต้องเป็นประเภท
boolean
หรือBoolean
หรือเกิดข้อผิดพลาดในการรวบรวมเวลา
boolean
ประเภทของเงื่อนไขและการแสดงออกอยู่เสมอ
- ณ รันไทม์นิพจน์ตัวถูกดำเนินการทางซ้ายจะถูกประเมินก่อน หากผลลัพธ์มีประเภท
Boolean
นั้นจะขึ้นอยู่กับการยกเลิกการแปลงกล่อง ( §5.1.8 )
- หากค่าผลลัพธ์คือ
false
ค่าของเงื่อนไขและนิพจน์คือfalse
และนิพจน์ตัวถูกดำเนินการทางด้านขวาจะไม่ถูกประเมิน
- หากค่าของตัวถูกดำเนิน
true
การทางซ้ายคือแสดงการแสดงออกทางขวามือ; หากผลลัพธ์มีประเภทBoolean
นั้นจะขึ้นอยู่กับการยกเลิกการแปลงกล่อง ( §5.1.8 ) ค่าผลลัพธ์จะกลายเป็นค่าของเงื่อนไขและนิพจน์
- ดังนั้น
&&
คำนวณผลลัพธ์เช่นเดียว&
กับในboolean
ตัวถูกดำเนินการ มันแตกต่างกันเฉพาะในการแสดงออกของตัวถูกดำเนินการทางขวาจะถูกประเมินตามเงื่อนไขมากกว่าเสมอ
เงื่อนไข - หรือมีคุณสมบัติดังต่อไปนี้:
- เงื่อนไขหรือโอเปอเรเตอร์มีการเชื่อมโยงจากด้านซ้ายของไวยากรณ์ (จัดกลุ่มจากซ้ายไปขวา)
- เงื่อนไขหรือตัวดำเนินการสัมพันธ์อย่างเต็มที่กับทั้งผลข้างเคียงและค่าผลลัพธ์ นั่นคือสำหรับการแสดงออกใด ๆ
a
, b
และc
การประเมินผลของการแสดงออกผลิตผลเดียวกันกับผลข้างเคียงที่เกิดขึ้นในการสั่งซื้อเช่นเดียวกับการประเมินผลของการแสดงออก((a) || (b)) || (c)
(a) || ((b) || (c))
- ตัวถูกดำเนินการแต่ละรายการของเงื่อนไขหรือตัวดำเนินการต้องเป็นประเภท
boolean
หรือBoolean
หรือเกิดข้อผิดพลาดในการรวบรวม
boolean
ประเภทของเงื่อนไขหรือการแสดงออกอยู่เสมอ
- ณ รันไทม์นิพจน์ตัวถูกดำเนินการทางซ้ายจะถูกประเมินก่อน หากผลลัพธ์มีประเภท
Boolean
นั้นจะขึ้นอยู่กับการยกเลิกการแปลงกล่อง ( §5.1.8 )
- หากค่าผลลัพธ์คือ
true
ค่าของเงื่อนไขหรือนิพจน์คือtrue
และนิพจน์ตัวถูกดำเนินการทางขวานั้นไม่ได้รับการประเมิน
- หากค่าของตัวถูกดำเนิน
false
การทางซ้ายคือแสดงการแสดงออกทางขวามือ; หากผลลัพธ์มีประเภทBoolean
นั้นจะขึ้นอยู่กับการยกเลิกการแปลงกล่อง ( §5.1.8 ) ค่าผลลัพธ์จะกลายเป็นค่าของเงื่อนไขหรือนิพจน์
- ดังนั้น
||
คำนวณผลลัพธ์เช่นเดียว|
กับในboolean
หรือBoolean
ถูกดำเนินการ มันแตกต่างกันเฉพาะในการแสดงออกของตัวถูกดำเนินการทางขวาจะถูกประเมินตามเงื่อนไขมากกว่าเสมอ
ในระยะสั้นเป็น @JohnMeagher ได้ชี้ให้เห็นซ้ำ ๆ ออกมาในความคิดเห็น&
และ|
ในความเป็นจริงไม่ใช่ลัดวงจรประกอบการบูลีนในกรณีที่เฉพาะเจาะจงของตัวถูกดำเนินการเป็นอย่างใดอย่างหนึ่งหรือboolean
Boolean
ด้วยแนวทางปฏิบัติที่ดี (เช่น: ไม่มีผลรอง) นี่เป็นความแตกต่างเล็กน้อย เมื่อตัวถูกดำเนินการไม่ใช่boolean
s หรือBoolean
s ตัวดำเนินการจะทำงานแตกต่างกันมาก : บิตและการดำเนินการแบบลอจิคัลนั้นไม่สามารถเปรียบเทียบได้ดีกับการเขียนโปรแกรมจาวาระดับสูง