الرمز يشبه هذا:
الفئة العامة TestPlusPlus {public static void main (string [] args) {int k = addafterReturn (10) ؛ system.out.println (k) ؛ // Output 10 int k1 = addbeforeReturn (10) ؛ System.out.println (K1) ؛ // output 11} int int addbeforeTurn (int i) {return ++ i ؛ } static int addafterreturn (int i) {return i ++ ؛ }}من مستوى Bytecode ،
رمز Bytecode of AddafterReturn كما يلي:
0: ILOAD_01: iinc 0 ، 14: iReturn
إنه بسيط ، يعني ILOAD_0 وضع قيمة العنصر المفهرس إلى 0 في الجدول المتغير المحلي إلى أعلى المكدس. لذلك ، يتم وضع قيمة I التي مررت بها في الجزء العلوي من المكدس ، ويعني IINC 0،1 وضع جدول المتغير المحلي
تتم إضافة عناصر مع الفهرس 0 إلى 1 ، وأخيراً تضع Ireturn قيمة int في الجزء العلوي من المكدس في إطار مكدس المتصل. (المداخن هنا هي أكوام المعامل)
لذلك ، لا يؤثر IINC 0 و 1 فعليًا على القيمة التي تم إرجاعها ، لذلك لا يزال العائد 10.
وبالمثل ، فإن AddBeforeReturn Bytecode هو كما يلي:
0: iinc 0 ، 13: ILOAD_04: iReturn
سأترك الأمر للجميع لتحليلهم. في الواقع ، من الواضح أن هذا يزيد أولاً ثم وضعه في المكدس. لذلك يتم زيادة القيمة التي تم إرجاعها بالفعل.
الآن دعنا نقوم بإجراء سؤال مقابلة قمت بتصحيحه.
الفئة العامة TestPlusPlus2 {static {x = 5 ؛ int y = 10 ؛ } static int x ، y ؛ public static void main (String args []) {x-- ؛ mymethod () ؛ System.out.println (x+y+++ x) ؛ } public static void mymethod () {y = x +++++ x ؛ }}هل تعرف الجواب؟ قم بتشغيله ، الإجابة الصحيحة هي 23.
إذا فهمت حقًا ما سبق ، فإن هذا السؤال بسيط للغاية أيضًا. بادئ ذي بدء ، أنت تعرف قيم X و Y قبل تنفيذ Main. وهذا ينطوي على آلية تحميل الطبقة. ستقوم مرحلة التحضير بتحميل الفئة بتعيين المتغير الثابت إلى القيمة الصفر لهذا النوع. إذا كانت int ، فهي تتوافق مع 0. في مرحلة التهيئة للفئة ، يتم جمع الكتل الثابتة وسلوكيات التنازل المتغيرة الثابتة في الفصل وفقًا لترتيب الكود لإنشاء الطريقة. لذلك ، في هذا الاختبار ، x = 5 ، y = 0 ؛
استمر في التحليل ، x--' ,所以x = 4,y = 0, myMethod 中y = x++ + ++x;
لن يضيف X ++ 1 قبل تنفيذ عملية الإضافة اللاحقة ، تمامًا مثل Return I ++ فقط بعد العودة (يمكنك فهم العائد على أنها عملية مكدس ILOAD أعلاه ، وليس تعليمات iRetrun) ، وبالتالي فإن الإضافة الأولى هي 4 ، ولكن يجب الإشارة هنا إلى أنه قبل تنفيذ ++ X ، فإن الزيادة قد بدأت بالفعل على X الفعلي ، فهو X هو 5 بالفعل ، لذا فإن ADED الثاني هو و 6.
ثم يكون الأمر بسيطًا للغاية x+y +++ x هو 6+10+7 هو 23. لحسن الحظ ، إذا كان بإمكانك فهم رمز bytecode ، فيمكنك ترجمة الرمز الباقري للرمز واستخدام رمز bytecde للتحقق منه ، ويمكنك أيضًا العثور على هذه النتائج.
دعنا نلقي نظرة على مثال آخر ، والذي قدمه اللاعبون الكبار في المجموعة. أعتقد أنه أيضًا أساسي للغاية.
static int plus (int i) {try {++ i ؛ System.out.println ("Try") ؛ إرجاع i ++ ؛ } أخيرًا {system.out.println ("أخيرًا") ؛ i ++ ؛ // return i ؛ }} public static void main (string [] args) {system.out.println (test1.plus (5)) ؛}هل يمكنك التفكير في مقدار الإخراج النهائي؟ إذا قمت بإزالة التعليقات ، فلهذا السبب لا تعود في الكتلة الأخيرة. لأنه بغض النظر عما إذا كان صحيحًا أو خطأ ، قد يتم دائمًا إرجاع قيمة معينة.
لخص
ما سبق هو شرح مفصل لـ I ++ و ++ I في أسئلة مقابلة Java التي قدمها المحرر. آمل أن يكون ذلك مفيدًا للجميع. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر على الجميع في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!