नोट : मूल रूप से मैंने चित्रण के प्रयोजनों के लिए इस उत्तर में C # कोड पोस्ट किया, क्योंकि C # आपको कीवर्ड के int
संदर्भ में पैरामीटर पारित करने की अनुमति देता है ref
। मैंने MutableInt
Google पर पाए जाने वाले प्रथम श्रेणी का उपयोग करके वास्तविक कानूनी जावा कोड के साथ इसे अपडेट करने का निर्णय लिया हैref
C # में कुछ किया है उसे । मैं वास्तव में नहीं बता सकता कि अगर मदद करता है या जवाब दर्द होता है। मैं कहूंगा कि मैंने व्यक्तिगत रूप से इतना जावा विकास नहीं किया है; इसलिए मुझे पता है कि इस बिंदु को स्पष्ट करने के लिए बहुत अधिक मुहावरेदार तरीके हो सकते हैं।
शायद अगर हम एक विधि लिखते हैं जो x++
यह करता है के बराबर करने के लिए यह स्पष्ट कर देगा।
public MutableInt postIncrement(MutableInt x) {
int valueBeforeIncrement = x.intValue();
x.add(1);
return new MutableInt(valueBeforeIncrement);
}
सही? उत्तीर्ण मूल्य में वृद्धि और मूल मूल्य लौटाएँ: यह पोस्टाइन्क्रिमेंट ऑपरेटर की परिभाषा है।
अब, देखते हैं कि यह व्यवहार आपके उदाहरण कोड में कैसे चलता है:
MutableInt x = new MutableInt();
x = postIncrement(x);
postIncrement(x)
क्या करता है? वृद्धि x
, हाँ। और फिर जो वेतन वृद्धि से पहले था वह लौटाता हैx
। यह रिटर्न वैल्यू तब सौंपी जाती है x
।
अतः दिए गए मानों का क्रम x
0 है, फिर 1, फिर 0 है।
यदि हम उपरोक्त को फिर से लिखते हैं तो यह और भी स्पष्ट हो सकता है:
MutableInt x = new MutableInt(); // x is 0.
MutableInt temp = postIncrement(x); // Now x is 1, and temp is 0.
x = temp; // Now x is 0 again.
इस तथ्य पर आपका निर्धारण कि जब आप x
उपरोक्त असाइनमेंट के बाईं ओर से प्रतिस्थापित करते हैं y
, "तो आप देख सकते हैं कि यह पहले एक्स को बढ़ाता है, और बाद में इसे y करने के लिए" मुझे हड़ताली के रूप में भ्रमित करता है। ऐसा नहीं है x
कि इसे सौंपा जा रहा है y
; यह पूर्व में दिया गया मान हैx
। वास्तव में, इंजेक्शन लगाने y
से ऊपर के परिदृश्य से कुछ अलग नहीं होता है; हमें बस मिल गया है:
MutableInt x = new MutableInt(); // x is 0.
MutableInt y = new MutableInt(); // y is 0.
MutableInt temp = postIncrement(x); // Now x is 1, and temp is 0.
y = temp; // y is still 0.
तो यह स्पष्ट है: x = x++
प्रभावी रूप से एक्स के मूल्य को नहीं बदलता है। यह हमेशा x को मान x 0 , फिर x 0 + 1 और फिर x 0 को फिर से मानने का कारण बनता है ।
अद्यतन : संयोग से, ऐसा न हो कि आपको संदेह हो कि x
कभी "इनक्रीमेंट ऑपरेशन" और असाइनमेंट ऊपर दिए गए उदाहरण के बीच "1" को सौंपा गया है, मैंने एक साथ एक त्वरित डेमो फेंक दिया है कि यह व्याख्या करने के लिए कि यह मध्यवर्ती मान वास्तव में "अस्तित्व में है," हालांकि यह है निष्पादित धागे पर "देखा" नहीं जाना चाहिए।
डेमो x = x++;
एक लूप में कॉल करता है जबकि एक अलग थ्रेड लगातार x
कंसोल के मूल्य को प्रिंट करता है।
public class Main {
public static volatile int x = 0;
public static void main(String[] args) {
LoopingThread t = new LoopingThread();
System.out.println("Starting background thread...");
t.start();
while (true) {
x = x++;
}
}
}
class LoopingThread extends Thread {
public @Override void run() {
while (true) {
System.out.println(Main.x);
}
}
}
नीचे उपरोक्त प्रोग्राम के आउटपुट का एक अंश है। 1s और 0s दोनों की अनियमित घटना पर ध्यान दें।
बैकग्राउंड थ्रेड शुरू ...
0
0
1
1
0
0
0
0
0
0
0
0
0
0
1
0
1