คำตอบอื่น ๆ ทำได้ดีมากในการครอบคลุมความแตกต่างของหน้าที่การใช้งานระหว่างตัวดำเนินการ แต่คำตอบสามารถนำไปใช้ได้กับภาษา 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 ) จะดำเนินการกับตัวถูกดำเนินการทั้งสองโดยปล่อยให้ตัวถูกดำเนินการทั้งสองเป็นlongs หรือints สำหรับการดำเนินการ ประเภทของการดำเนินการจะเป็นประเภทของตัวถูกดำเนินการ (เลื่อนระดับ) ณ จุดนั้น&จะเป็นระดับบิตและ^จะเป็นระดับบิตพิเศษและ|จะรวมระดับบิต ( §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ด้วยแนวทางปฏิบัติที่ดี (เช่น: ไม่มีผลรอง) นี่เป็นความแตกต่างเล็กน้อย เมื่อตัวถูกดำเนินการไม่ใช่booleans หรือBooleans ตัวดำเนินการจะทำงานแตกต่างกันมาก : บิตและการดำเนินการแบบลอจิคัลนั้นไม่สามารถเปรียบเทียบได้ดีกับการเขียนโปรแกรมจาวาระดับสูง