ฉันไม่แน่ใจว่ามีรายการใน Java Language Specification ที่สั่งให้โหลดค่าก่อนหน้าของตัวแปร ...
นั่นคือ ครั้งต่อไปที่คุณไม่แน่ใจว่าข้อกำหนดระบุอะไรโปรดอ่านข้อมูลจำเพาะแล้วถามคำถามหากไม่ชัดเจน
... ทางด้านขวา(x = y)
ซึ่งควรคำนวณจากคำสั่งโดยนัยสำหรับวงเล็บก่อน
คำสั่งนั้นเป็นเท็จ วงเล็บไม่ได้หมายความคำสั่งของการประเมินผล ใน Java ลำดับของการประเมินผลจากซ้ายไปขวาโดยไม่คำนึงถึงวงเล็บ วงเล็บกำหนดขอบเขตของนิพจน์ย่อยไม่ใช่ลำดับของการประเมินผล
ทำไมนิพจน์แรกประเมินว่าเป็นเท็จ แต่ข้อที่สองประเมินเป็นจริง
กฎสำหรับ==
ผู้ปฏิบัติงานคือ: ประเมินทางด้านซ้ายเพื่อสร้างค่าประเมินทางด้านขวาเพื่อสร้างค่าเปรียบเทียบค่าการเปรียบเทียบคือค่าของนิพจน์
กล่าวอีกนัยหนึ่งความหมายของคำexpr1 == expr2
นั้นเหมือนกับว่าคุณได้เขียนtemp1 = expr1; temp2 = expr2;
และประเมินผลแล้วtemp1 == temp2
และประเมินผลแล้ว
กฎสำหรับ=
ผู้ประกอบการที่มีตัวแปรท้องถิ่นทางด้านซ้ายคือ: ประเมินทางด้านซ้ายเพื่อสร้างตัวแปรประเมินด้านขวาในการสร้างค่าดำเนินการกำหนดผลที่ได้คือค่าที่ได้รับมอบหมาย
ดังนั้นรวบรวม:
x == (x = y)
เรามีผู้ดำเนินการเปรียบเทียบ ประเมินทางด้านซ้ายเพื่อสร้างค่า - เราได้ค่าปัจจุบันx
เป็น ประเมินทางด้านขวา: นั่นคือการกำหนดค่าดังนั้นเราจึงประเมินด้านซ้ายเพื่อสร้างตัวแปร - ตัวแปรx
- เราประเมินด้านขวา - ค่าปัจจุบันของy
- กำหนดให้x
และผลลัพธ์คือค่าที่กำหนด จากนั้นเราจะเปรียบเทียบค่าดั้งเดิมของx
กับค่าที่กำหนด
คุณสามารถ(x = y) == x
ออกกำลังกายได้ โปรดจำไว้ว่ากฎทั้งหมดสำหรับการประเมินด้านซ้ายเกิดขึ้นก่อนกฎการประเมินด้านขวาทั้งหมด
ฉันคาดว่าจะประเมิน (x = y) ก่อนแล้วจึงเปรียบเทียบ x กับตัวเอง (3) และคืนค่าจริง
ความคาดหวังของคุณขึ้นอยู่กับชุดของความเชื่อที่ไม่ถูกต้องเกี่ยวกับกฎของ Java หวังว่าตอนนี้คุณมีความเชื่อที่ถูกต้องและในอนาคตคาดหวังสิ่งที่แท้จริง
คำถามนี้แตกต่างจาก "ลำดับการประเมินของนิพจน์ย่อยในนิพจน์ Java"
คำสั่งนี้เป็นเท็จ คำถามนั้นมีความสัมพันธ์กันอย่างสมบูรณ์
x ไม่ใช่ 'subexpression' ที่นี่แน่นอน
คำสั่งนี้ยังเป็นเท็จ มันเป็น subexpression สองครั้งในแต่ละตัวอย่าง
จะต้องโหลดสำหรับการเปรียบเทียบแทนที่จะเป็น 'ประเมิน'
ฉันไม่รู้ว่ามันหมายถึงอะไร
เห็นได้ชัดว่าคุณยังมีความเชื่อที่ผิด ๆ มากมาย คำแนะนำของฉันคือให้คุณอ่านข้อกำหนดจนกว่าความเชื่อที่ผิดของคุณจะถูกแทนที่ด้วยความเชื่อที่แท้จริง
คำถามคือเฉพาะ Java และนิพจน์ x == (x = y) ซึ่งแตกต่างจากโครงสร้างที่ไม่สามารถใช้งานได้จริงที่สร้างขึ้นมาโดยทั่วไปสำหรับคำถามสัมภาษณ์ที่ยุ่งยากมาจากโครงการจริง
ที่มาของการแสดงออกไม่เกี่ยวข้องกับคำถาม กฎสำหรับการแสดงออกดังกล่าวมีการอธิบายไว้อย่างชัดเจนในข้อกำหนด; อ่านมัน!
มันควรจะเป็นการแทนที่หนึ่งบรรทัดสำหรับสำนวนเปรียบเทียบและแทนที่
เนื่องจากการแทนที่หนึ่งบรรทัดทำให้เกิดความสับสนอย่างมากในตัวคุณผู้อ่านรหัสฉันขอแนะนำว่ามันเป็นตัวเลือกที่แย่ การทำให้รหัสกระชับขึ้น แต่ยากที่จะเข้าใจไม่ใช่การชนะ มันไม่น่าจะทำให้รหัสเร็วขึ้น
อนึ่ง C # มีการเปรียบเทียบและแทนที่เป็นวิธีการห้องสมุดซึ่งสามารถ jitted ลงไปที่การเรียนการสอนเครื่อง ฉันเชื่อว่า Java ไม่มีวิธีการดังกล่าวเนื่องจากไม่สามารถแสดงในระบบประเภท Java