รหัสมีลักษณะเช่นนี้:
Public Class TestPlus {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {int k = addafterreturn (10); System.out.println (k); // เอาท์พุท 10 int k1 = addbeforereturn (10); System.out.println (K1); // output 11} public int addbeforereturn (int i) {return ++ i; } public int public int addafterReturn (int i) {return i ++; -จากระดับ bytecode
bytecode ของ addafterreturn มีดังนี้:
0: iload_01: iinc 0, 14: ireturn
มันง่าย iload_0 หมายถึงการใส่ค่าขององค์ประกอบที่จัดทำดัชนีเป็น 0 ในตารางตัวแปรท้องถิ่นที่ด้านบนของสแต็ก ดังนั้นค่าของฉันผ่านจะถูกวางไว้ที่ด้านบนของสแต็กและ IINC 0,1 หมายถึงการวางตารางตัวแปรท้องถิ่น
องค์ประกอบที่มีดัชนี 0 จะถูกเพิ่มลงใน 1 และในที่สุด Ireturn จะใส่ค่า int ที่ด้านบนของสแต็กลงในกรอบสแต็กของผู้โทร (สแต็คที่นี่คือตัวถูกดำเนินการสแต็ค)
ดังนั้น IINC 0 และ 1 จะไม่ส่งผลกระทบต่อค่าที่ส่งคืนดังนั้นผลตอบแทนจึงยังคงเป็น 10
ในทำนองเดียวกัน AddBeForerEturn bytecode มีดังนี้:
0: IINC 0, 13: ILOAD_04: IRETURN
ฉันจะปล่อยให้ทุกคนเพื่อการวิเคราะห์ของพวกเขาเอง ในความเป็นจริงเห็นได้ชัดว่านี่เป็นการเพิ่มขึ้นก่อนแล้วจึงใส่ลงในสแต็ก ดังนั้นค่าที่ส่งคืนจะเพิ่มขึ้นจริง
ตอนนี้เรามาทำคำถามสัมภาษณ์ที่ฉันได้แก้ไขตัวเอง
Public Class TestPlus2 {Static {x = 5; int y = 10; } int Static int x, y; โมฆะคงที่สาธารณะหลัก (String args []) {x--; mymethod (); System.out.println (x+y+++ x); } โมฆะคงที่สาธารณะ myMethod () {y = x +++++ x; -คุณรู้คำตอบหรือไม่? เรียกใช้คำตอบที่ถูกต้องคือ 23
หากคุณเข้าใจข้างต้นจริงๆคำถามนี้ก็ง่ายมาก ก่อนอื่นคุณจะรู้ถึงค่าของ X และ Y ก่อนที่จะดำเนินการหลัก สิ่งนี้เกี่ยวข้องกับกลไกการโหลดคลาส ขั้นตอนการเตรียมการของการโหลดคลาสจะกำหนดตัวแปรสแตติกให้กับค่าศูนย์ของประเภทนี้ หาก int เป็น int มันจะสอดคล้องกับ 0. ในขั้นตอนการเริ่มต้นของคลาสบล็อกคงที่และพฤติกรรมการกำหนดตัวแปรสแตติกในคลาสจะถูกรวบรวมตามลำดับรหัสเพื่อสร้างวิธีการ ดังนั้นในการทดสอบนี้ x = 5, y = 0;
วิเคราะห์ต่อไป x--' ,所以x = 4,y = 0, myMethod 中y = x++ + ++x;
X ++ จะไม่เพิ่ม 1 ก่อนที่จะดำเนินการเพิ่มการดำเนินการต่อไปเช่นเดียวกับการส่งคืน i ++ หลังจากกลับมา (คุณสามารถเข้าใจการกลับมาเป็น iload stack การดำเนินการด้านบนไม่ใช่คำสั่ง iretrun) ดังนั้นการเพิ่มครั้งแรกคือ 4 แต่ควรสังเกตที่นี่
จากนั้นมันง่ายมาก x+y +++ x คือ 6+10+7 คือ 23 โชคดีถ้าคุณสามารถเข้าใจ bytecode คุณสามารถแปลไบต์ของรหัสและใช้ bytecode เพื่อตรวจสอบและคุณยังสามารถค้นหาผลลัพธ์ดังกล่าวได้
ลองมาดูตัวอย่างอีกตัวอย่างหนึ่งซึ่งจัดทำโดยผู้ชายตัวใหญ่ในกลุ่ม ฉันคิดว่ามันเป็นพื้นฐานมาก
สาธารณะคงที่ int plus (int i) {ลอง {++ i; System.out.println ("ลอง"); กลับ i ++; } ในที่สุด {system.out.println ("สุดท้าย"); i ++; // return i; }} โมฆะคงที่สาธารณะหลัก (สตริง [] args) {system.out.println (test1.plus (5));}คุณคิดได้ไหมว่าเอาต์พุตสุดท้ายเท่าไหร่? หากคุณลบความคิดเห็นนี่คือเหตุผลที่คุณไม่กลับในบล็อกในที่สุด เพราะไม่ว่าจะถูกหรือผิดอาจมีการส่งคืนค่าที่แน่นอน
สรุป
ข้างต้นเป็นคำอธิบายโดยละเอียดของ I ++ และ ++ I ในคำถามสัมภาษณ์ Java ที่แนะนำโดยบรรณาธิการ ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับทุกคนในเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!