2009-03-17 9 views
14

निम्नलिखित कोड को देखते हुए, ix जोड़ें जो आप उम्मीद करेंगे, i। ई। वृद्धि से पहले ix के मान वापस करें, लेकिन समारोह छोड़ने से पहले कक्षा के सदस्य को बढ़ाएं?जावा में, एक पोस्ट वृद्धि ऑपरेटर रिटर्न स्टेटमेंट में कैसे कार्य करता है?

class myCounter { 
    private int _ix = 1; 

    public int ixAdd() 
    { 
     return _ix++; 
    } 
} 

मैं काफी यकीन है कि अगर पोस्ट/पूर्व वेतन वृद्धि के लिए सामान्य नियम भी बदले बयान में लागू होगा जब कार्यक्रम समारोह के ढेर फ्रेम छोड़ देता है (या जो भी यह जावा में है) नहीं था।

+1

आप इसे क्यों नहीं देखते? –

+2

ehm .. आप का मतलब है, ऊपर दिए गए कोड को मेरे संपादक में पेस्ट करें और इसे चलाएं? मुझे नहीं पता, क्षमा करें। :- मैं खुद को एक कप कॉफी प्राप्त करूंगा ... –

+0

करीब के लिए मतदान किया ... मैंने सोचा कि लेखक इसे तुरंत बंद कर सकता है? –

उत्तर

25

मुख्य भाग यह है कि अभिव्यक्ति का मूल्यांकन होने के बाद पोस्ट वृद्धि/कमी तुरंत होती है। वापसी होने से पहले न केवल ऐसा होता है - किसी भी बाद के अभिव्यक्तियों का मूल्यांकन करने से पहले ऐसा होता है। ,

class myCounter { 
    private int _ix = 1; 

    public int ixAdd() 
    { 
     return _ix++ + giveMeZero(); 
    } 

    public int giveMeZero() 
    { 
     System.out.println(_ix); 
     return 0; 
    } 
} 

कि रूप में अच्छी तरह से बाहर की संख्या बढ़ परिणाम मुद्रित होगा क्योंकि वेतन वृद्धि से पहले giveMeZero() कहा जाता है होता है: उदाहरण के लिए, आप ने लिखा लगता है।

+0

उत्तर के लिए धन्यवाद, जॉन। जैसा कि पॉल टॉम्बलिन ने इंगित किया था, पोस्ट के बजाय मेरे संपादक में कोड टाइप करने से भी इसका उत्तर दिया होगा। लेकिन अब मैंने उससे अधिक जानकारी प्राप्त की है। –

+0

@ जोन: सी से जावा आने वाले लोगों के लिए (जो बहुत से लोग होंगे), यह इंगित करना एक अच्छी बात है। लंबे समय तक जावा उपयोगकर्ता जिसने पहली बार लंबे समय तक सी का उपयोग किया था, मुझे नहीं पता था कि जावा ने परिभाषित किया है कि ++ सी से अधिक स्पष्ट रूप से कैसे काम करता है। मैंने सी से "चालाक" ++ उपयोग से बचने के लिए सीखा! – Eddie

+0

_ न केवल वापसी होने से पहले ऐसा होता है _ लेकिन वापसी का विवरण वृद्धिशील मान वापस नहीं कर रहा है यदि यह एक स्थानीय चर है। आपका उदाहरण वैश्विक चर दिखाता है। – ernesto

1

हां, सामान्य नियम एक वापसी विवरण पर भी पोस्ट वृद्धि के लिए आवेदन करते हैं। असल में, यह निम्न स्तर पर क्या करेगा, एक रजिस्टर में रिटर्न वैल्यू स्टोर करता है, फिर कक्षा के सदस्य को बढ़ाता है, फिर विधि से वापस आ जाता है।

आप इसे इस प्रश्न के लिए a later answer में देख सकते हैं जो बाइट कोड दिखाता है।

0

हां, यह करता है।

लेकिन ऐसा न करें, अभिव्यक्तियों में साइड इफेक्ट्स होने के लिए यह खराब शैली है।

+0

यहां दुष्प्रभाव बहुत अधिक इरादा है और मैं इसे कोई नुकसान नहीं देख सकता। –

+0

लेकिन यह आपके प्रश्न के अनुसार, यह समझना मुश्किल बनाता है। – starblue

16

ठीक है, (javap -c <classname> का उपयोग यह अपने आप को देखने के लिए) बाईटकोड को देखो:

Compiled from "PostIncTest.java" 
class myCounter extends java.lang.Object{ 
myCounter(); 
    Code: 
    0: aload_0 
    1: invokespecial #1; //Method java/lang/Object."<init>":()V 
    4: aload_0 
    5: iconst_1 
    6: putfield #2; //Field _ix:I 
    9: return 

public int ixAdd(); 
    Code: 
    0: aload_0 
    1: dup 
    2: getfield #2; //Field _ix:I 
    5: dup_x1 
    6: iconst_1 
    7: iadd 
    8: putfield #2; //Field _ix:I 
    11: ireturn 

} 

आप देख सकते हैं, निर्देश 6 और 7 ixAdd() में वापसी से पहले वेतन वृद्धि संभाल। इसलिए, जैसा कि हम उम्मीद करेंगे, रिटर्न स्टेटमेंट में उपयोग किए जाने पर कमी ऑपरेटर का वास्तव में प्रभाव पड़ता है। नोटिस, हालांकि, इन दो प्रकट होने से पहले dup निर्देश है; वृद्धि मूल्य (बेशक) वापसी मूल्य में परिलक्षित नहीं है।

0

यह वृद्धि से पहले मूल्य वापस करता है, और उसके बाद _ix वृद्धि करता है। इसलिए पहली बार जब आप विधि को कॉल करते हैं ix मेरे काउंटर के उदाहरण पर जोड़ें, यह 1 वापस आ जाएगा, दूसरी बार यह 2 लौटाएगा, और इसी तरह।

संबंधित मुद्दे