يُعتقد عمومًا أن Pre-Position ++ يضيف أولاً قيمة المتغير إلى 1 ، ثم يستخدم القيمة بعد إضافة 1 للمشاركة في العملية ؛ بينما يستخدم Post-Position ++ القيمة أولاً للمشاركة في العملية ، ثم يضيف القيمة إلى 1.
دعونا نلقي نظرة على المثال الأول:
اختبار الحزمة ؛ الفئة العامة plus_test01 {public static void main (string [] args) {int i = 100 ؛ i = i ++ ؛ system.out.println (i) ؛ }}خمن ما هي النتيجة؟
دعونا ننظر إلى الثانية:
اختبار الحزمة ؛ الفئة العامة plus_test02 {public static void main (string [] args) {int k = 100 ؛ بينما (صحيح) {if (k ++> 100) {// system.out.println (k) ؛ استراحة؛ } system.out.println (k) ؛ }}}خمن ما هي النتيجة؟
في الواقع ، سواء كان ذلك قبل-++ أو post-++ ، يتم زيادة قيمة المتغير أولاً بمقدار 1 قبل الاستمرار في الحساب. الفرق الحقيقي بين الاثنين هو: يضيف ما قبل-++ قيمة المتغير بمقدار 1 ويستخدم القيمة المضافة لإجراء العمليات الحسابية ، بينما يقوم المنشور-++ أولاً بتعيين المتغير إلى متغير مؤقت ، ثم يضيف 1 إلى قيمة المتغير ، ثم يستخدم هذا المتغير المؤقت لأداء الحسابات.
للحصول على مقتطف الكود التالي (بادئة ++):
int i = 1 ؛
int j = ++ i*5 ؛
في الواقع ، الجملة الثانية تعادل:
i+= 1 ؛ // أضف I إلى 1
j = i*5 ؛ // احسب القيمة بعد إضافة 1 معها ، والنتيجة هي: 10
وبالنسبة لقتل الكود التالي (post-++):
int i = 1 ؛
int j = i ++*5 ؛
الجملة الثانية تعادل:
int temp = i ؛ // تعيين I إلى متغير مؤقت
i+= 1 ؛ // أضف I إلى 1
J = temp*5 ؛ // احسب المتغير المؤقت معه ، والنتيجة هي: 5
على سبيل المثال ، فإنه يعادل:
int temp = i ؛
i+= 1 ؛
أنا = درجة الحرارة ؛ //
لذلك يجب أن تكون النتيجة دون تغيير ، أي 100.
رمز التجميع للمثال الأول هو:
الفراغ الثابت العام الرئيسي (java.lang.string []) ؛ واصف الواصف: ([ljava/lang/string ؛) V الأعلام: acc_public ، acc_static رمز: stack = 2 ، السكان المحليين = 2 ، args_size = 1 0: bipush 100 2: istore_1 3: iload_1 4: iinc 1 ، 1 // الثانية في المتغير المحلي 1 7: iStore_1 // java/lang/system.out: ljava/io/printstream ؛ 11: ILOAD_1 // المعلمة المحملة هي الثانية في المكدس ، أي أنه لا يزال 100 12: InvokeVirtual #22 // method java/io/printstream.println: (i) v 15: return
على سبيل المثال ، ليس من الصعب في الواقع ، ولكن النتيجة هي 101. انتبه إلى العملية ولا يمكنك ارتكاب مثل هذه الأخطاء في المستقبل. (العملية هي: أولاً قارن temp = i ، temp> 100 ، من الواضح أنه لا صدق. تخطي i+= 1 إلى جملة Syso ، بالطبع ، طباعة 101 ، حلقة مرة أخرى ، وهناك أيضًا temp = i ، temp> 100 ، هذه المرة صحيحة ، وبعد ذلك i+= 1 ، يخرج من الحلقة مباشرة ، والبيان في الوقت الذي سيتم تنفيذه).
تجميع المثال الثاني (تم تحديد الطريقة الرئيسية فقط):
الفراغ الثابت العام الرئيسي (java.lang.string []) ؛ واصف الوصف: ([ljava/lang/string ؛) v الأعلام: acc_public ، acc_static رمز: stack = 2 ، السكان المحليين = 2 ، args_size = 1 0: bipush 100 // 100 push stack 2: iStore_1 // save to the second the second var local var هي الطريقة المعلمة) 3: iload_1 من VAR المحلي (يزداد المتغير المحلي ، لا تزال النتيجة في VAR المحلية ، لن يتغير الجزء العلوي من المكدس المعامل) 7: BIPUSH 100 // 100 push stack 9: IF_ICMPLE 15 // قارن قيمتي int int في الجزء العلوي من المعامل ، وترتفع إلى الأعلى ، وإذا كان هناك TOP -TTAPE. 2) 15: getStatic #2 // Field Java/Lang/System.out: ljava/io/printstream ؛ 18: ILOAD_1 // // تحميل من أول VAR المحلي 19: InvokeVirtual #3 // الطريقة java/io/printstream.println: (i) v // اتصل على هذه الطريقة 22: goto 3 // القفز مرة أخرى إلى 3 ، حلقة مرة أخرى 25: إرجاع // مخرج
المثال الثالث:
اختبار الحزمة public class plus_test03 {static int proplus () {int i = 55 ؛ int j = ++ i ؛ العودة ي. // 56} static int postPlus () {int i = 55 ؛ int j = i ++ ؛ العودة ي. // 55} الفراغ الثابت العام (سلسلة [] args) {system.out.println (proplus ()) ؛ // 56 system.out.println (postplus ()) ؛ // 55}}تجميع المثال الثالث:
ثابت int proplus () ؛ واصف: () I Flags: acc_static رمز: stack = 1 ، السكان المحليون = 2 ، args_size = 0 0: bipush 55 // 55 stack 2: ISTORE_0 // تخزين الجزء العلوي من المكدس int إلى أول 3: iinc 0 ، 1 // The First Local var plus 1 6: iload_0 // load var local 7: is is isor // الجزء العلوي من المكدس هو ثاني VAR 9: iReturnstatic int postplus () ؛ واصف الواصف: () I Flags: ACC_STATIAT CODE: stack = 1 ، السكان المحليين = 2 ، args_size = 0 0: bipush 55 2: ISTORE_0 3: ILOAD_0 // load to stack 4: iinc 0 ، 1 // The First Var Plus 1 7: ISTORE_1 8: ILOAD_1
يمكن ملاحظة أن الفرق بين Front ++ والخلفية ++ هو الجزء الأزرق أعلاه (// أول Var Plus 1) ، وهو عكس ذلك. بالنسبة للسلف ، سيتم إضافة الرقم الموجود في VAR المحلي 1 ثم يتم تحميله في المكدس ، بينما سيتم تحميل الأخير من المكدس المحلي VAR إلى المكدس ، ثم سيتم إضافة VAR المحلي 1 ، وهو ما يعادل ترك نسخة احتياطية.
ختاماً:
واحد. يضيف كل من الوضع المسبق و Post-Position ++ كلاهما إلى القيمة المتغيرة أولاً ، بدلاً من إضافة 1 إلى Pre-Position ++ ثم الحساب ، في حين أن Post-Position ++ أولاً ثم الحساب.
اثنين. من الناحية البرمجي ، يقوم المنشور-++ أولاً بتعيين المتغير إلى متغير مؤقت ، ثم يضيف قيمة المتغير بمقدار 1 ، ثم يستخدم المتغير المؤقت للمشاركة في العملية.
ثلاثة. من وجهة نظر التعليمات ، يتم دفع قيمة المتغير على المكدس قبل تنفيذ التعليمات ذات القيمة المضافة (IINC). بعد تنفيذ التعليمات ذات القيمة المضافة ، يتم استخدام القيمة التي يتم دفعها على المكدس.
آمل أنه من خلال هذه المقالة ، سأفهم تمامًا الفرق بين عمليات ما قبل الوضع ++ وما بعد الوضع ++. شكرا لك على دعمك لهذا الموقع!