के निम्नलिखित कार्यक्रम के बाईटकोड पर एक नज़र डालें:
package A;
public class Test
{
public static void main(String[] args)
{
int a = 1;
a += (a = 2);
}
}
हम सिर्फ इस आदेश को चलाने के लिए की जरूरत है:
public class A.Test {
public A.Test();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_1
1: istore_1
2: iload_1
3: iconst_2
4: dup
5: istore_1
6: iadd
7: istore_1
8: return
}
:
javap -c Test.class
निम्नलिखित बाईटकोड पाने के लिए
स्पष्टीकरण:
हम सिर्फ मुख्य विधि के अंदर दो पंक्तियों पर ध्यान दिया जाएगा:
int a = 1;
a += (a = 2);
[int a = 1;
यहाँ शुरू होता है]
0: iconst_1
-------------
| |
-------------
| |
-------------
| 1 |
-------------
STACK
1: istore_1
- पॉप पूर्णांक
variable 1
के ढेर से मूल्य
-------------
| | variable 1
------------- --------------
| | | 1 |
------------- --------------
| |
-------------
STACK
(
variable 1
a
प्रतिनिधित्व करता है)
[int a = 1;
खत्म यहाँ]
[a += (a = 2);
यहाँ शुरू होता है]
2: iload_1
- स्थानीय
variable 1
से एक पूर्णांक मूल्य लोड करता है और ढेर पर इसे धक्का।
-------------
| | variable 1
------------- --------------
| | | |
------------- --------------
| 1 |
-------------
STACK
3: iconst_2
-------------
| | variable 1
------------- --------------
| 2 | | |
------------- --------------
| 1 |
-------------
STACK
4: dup
- ढेर के शीर्ष पर मूल्य नकल।
variable 1
के ढेर से
-------------
| 2 | variable 1
------------- --------------
| 2 | | |
------------- --------------
| 1 |
-------------
STACK
5: istore_1
-------------
| | variable 1
------------- --------------
| 2 | | 2 |
------------- --------------
| 1 |
-------------
STACK
6: iadd
- एक साथ शीर्ष दो मानों को जोड़ता है।
variable 1
के ढेर से
-------------
| | variable 1
------------- --------------
| | | 2 |
------------- --------------
| 3 |
-------------
STACK
7: istore_1
-------------
| | variable 1
------------- --------------
| | | 3 |
------------- --------------
| |
-------------
STACK
[a += (a = 2);
खत्म यहाँ]
8: return
निष्कर्ष:
a = a + (a = 2)
कई आपरेशनों के माध्यम से किया जाता है। 2: iload_1
को a += (a = 2);
के पहले कमांड के रूप में निष्पादित किया गया है जो समीकरण a = a + (a = 2)
के पहले ऑपरेंड को पढ़ता है और ढेर पर धक्का देता है।
अगला, 3: iconst_2
और 4: dup
निष्पादित किए गए हैं जो मूल रूप से int 2
स्टैक पर दो बार धक्का देते हैं; इसे a
पर लोड करने के लिए और दूसरा दूसरा ऑपरेंड के रूप में लोड करने के लिए। उसके बाद, 5: istore_1
निष्पादित किया गया है जो 2
a
(a = 2
) में लोड हो रहा है।
अंत में, 6: iadd
और 7: istore_1
क्रियान्वित कर रहे हैं जहां 6: iadd
पहले संकार्य और दूसरे संकार्य कहते हैं और ढेर पर परिणाम धक्का, और 7: istore_1
परिणाम है और यह भार a
में दिखाई नहीं देता।
सादगी के लिए, हम इस कोड पर एक त्वरित नजर डालते हैं:
public class A.Test {
public A.Test();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_1
1: istore_1
2: iconst_3
3: istore_2
4: iload_1
5: iload_2
6: iadd
7: istore_1
8: return
}
आप देख सकते हैं, यह बस निम्नलिखित है:
int a = 1;
int b = 3;
a += b;
और यहाँ अपने बाईटकोड है:
- लोड 0 int01 में लोड करता है।
- लोड
3
b
में लोड करता है।
a
धक्का पर b
धक्का देता है।
- उन पर अतिरिक्त प्रदर्शन करता है और परिणाम को ढेर पर धक्का देता है।
- स्टैक से परिणाम रोकता है और इसे
a
में संग्रहीत करता है।
संबंधित: http://stackoverflow.com/questions/11324850/why-swapping-integer-variable-by-xor-doesnt-work-in-a-single-line/11325458 – nhahtdh
के रूप में 'पूर्णांक एक ही = 1; int tmpvar = (ए = 2); ए + = tmpvar; ' –
यह 'ए = ए + (ए = 2);' में अनुवाद करता है, और ऑपरेटरों का मूल्यांकन बाएं से दाएं किया जाता है। –