ก่อนอื่นมีภูมิหลังบางอย่าง: ฉันเป็นครูฝึกอบรมด้านไอทีและฉันพยายามแนะนำผู้ประกอบการบูลีนของ java กับชั้นเรียนเกรด 10 ของฉัน ครูที่ปรึกษาของฉันตรวจสอบแผ่นงานที่ฉันเตรียมและแสดงความคิดเห็นว่าฉันสามารถให้พวกเขาใช้เพียง & & หรือเดียว เพื่อแสดงโอเปอเรเตอร์เพราะพวกเขา "ทำสิ่งเดียวกัน"
ฉันตระหนักถึงความแตกต่างระหว่าง & และ &&
& เป็นตัวดำเนินการระดับบิตสำหรับใช้ระหว่างจำนวนเต็มเพื่อดำเนินการ "bit-twiddling"
&& เป็นตัวดำเนินการตามเงื่อนไขที่มีไว้สำหรับใช้ระหว่างค่าบูลีน
เพื่อพิสูจน์จุดที่ตัวดำเนินการเหล่านี้ไม่ได้ "ทำสิ่งเดียวกัน" เสมอไปฉันหาตัวอย่างที่ใช้ค่าบิตระหว่างค่าบูลีนจะทำให้เกิดข้อผิดพลาด ฉันพบตัวอย่างนี้
boolean bitwise;
boolean conditional;
int i=10, j=12;
bitwise = (i<j) | ((i=3) > 5); // value of i after oper: 3
System.out.println(bitwise+ " "+ i);
i=10;
conditional = (i<j) || (i=3) > 5 ; // value of i after oper: 10
System.out.println(conditional+ " "+ i);
i=10;
bitwise = (i>j) & (i=3) > 5; // value of i after oper: 3
System.out.println(bitwise+ " "+ i);
i=10;
conditional = (i>j) && (i=3) > 5; // value of i after oper: 10
System.out.println(conditional+ " "+ i);
ตัวอย่างนี้แสดงให้เห็นว่าหากค่าจะต้องมีการเปลี่ยนแปลงโดยในช่วงครึ่งหลังของการแสดงออกนี้จะนำไปสู่ความแตกต่างระหว่างผลลัพธ์เนื่องจาก bitwise เป็นผู้ประกอบการกระตือรือร้นในขณะที่เงื่อนไขทำงานเป็นลัดวงจร (ไม่ประเมินที่สอง ครึ่งถ้าครึ่งแรกเป็นเท็จในกรณีของ && และเป็นจริงในกรณีของ ||)
ฉันมีปัญหากับตัวอย่างนี้ ทำไมคุณต้องการเปลี่ยนค่าในเวลาเดียวกับที่คุณทำการเปรียบเทียบกับมัน? ดูเหมือนว่าจะไม่มีประสิทธิภาพในการเขียนโค้ด ฉันเกลียดการทำหลาย ๆ อย่างในบรรทัดเดียวในรหัสการผลิตของฉันเสมอ ดูเหมือนว่าเป็น "โคบาลโคบาล" ที่ไม่มีความรู้สึกผิดชอบชั่วดีในเรื่องการดูแลรักษาโค้ดของเขา ฉันรู้ว่าในบางโดเมนรหัสจะต้องมีขนาดกะทัดรัดที่สุดเท่าที่จะทำได้
ฉันสามารถอธิบายตัวเลือกของฉันในการสนับสนุนการใช้ && และ || เกิน & และ เพราะนี่คือการประชุมการเข้ารหัสได้รับการยอมรับในด้านวิศวกรรมซอฟต์แวร์
แต่ใครบางคนได้โปรดให้ฉันดีขึ้นแม้ในโลกแห่งความจริงตัวอย่างการใช้ตัวดำเนินการระดับบิตในนิพจน์เงื่อนไข