2017-02-14 11 views
10

मुझे समझ में नहीं आ रहा है कि यह पोस्ट वृद्धि समीकरण क्यों नहीं बढ़ता है। मैंने सोचा होगा कि + = ऑपरेशन के बाद मान 1 से बढ़ेगा और फिर दूसरी बार मेरे पास 1 मान होगा। लेकिन आउटपुट 0 शून्य का अनंत लूप है। क्या कोई यह समझाने में सक्षम है कि 'मैं' क्यों नहीं बढ़ता है।पोस्ट वृद्धि अनंत लूप i + = i ++;

int i = 0; 
for(; ;) { 
    if (i >= 10) break; 
    i += i++; 
} 
System.out.println(i); 
+1

एक साइड नोट के रूप में, व्यवहार इस बात से आता है कि पोस्ट-वृद्धि को कैसे परिभाषित किया गया है और कैसे + = ऑपरेटर काम करता है। जेएस में और शायद अन्य भाषाओं में भी वही व्यवहार देखा जा सकता है। – njzk2

+0

* जावा पज़लर * में एक समान लेकिन थोड़ी सी चाल वाली पहेली है [* अवरोध वृद्धि *] (http://cs.fit.edu/~ryan/cse4051/java-puzzlers/4-loopy-puzzlers/puzzle-25/Increment -java.html)। – shmosel

+0

जावा और सी # में यह अनंत लूप आउटपुट करता है। लेकिन सी में यह कोड की तरह आउटपुट है: 'i + = ++ i; 'भाषा से भाषा में परिवर्तन। –

उत्तर

6

जबकि @ njzk2 से जवाब सही है, यह क्यों यह सही है बाहर बात करने के लिए उपयोगी है।

अन्य संभावनाएं हैं - उदाहरण के लिए, जावा असाइनमेंट के बाद पोस्टिनक्रिएट ऑपरेटर निष्पादित क्यों नहीं करता है? (उत्तर: क्योंकि जावा भाषा डिजाइनर ने यह नहीं चुना है)

यौगिक असाइनमेंट के लिए मूल्यांकन आदेश (+= जैसी चीजें) जावा भाषा विशिष्टता अनुभाग 15.26.2 में निर्दिष्ट है। मैं how it is defined for Java 8 बोली होगी:

  • पहले, बाएं हाथ संकार्य एक चर उत्पादन करने के लिए मूल्यांकन किया जाता है।यदि यह मूल्यांकन अचानक समाप्त हो जाता है, तो असाइनमेंट अभिव्यक्ति उसी कारण से अचानक समाप्त हो जाती है; दायां हाथ ऑपरेंड मूल्यांकन नहीं किया गया है और कोई असाइनमेंट नहीं होता है।

  • अन्यथा, बाएं हाथ के ऑपरेंड का मूल्य सहेजा गया है और फिर दाएं हाथ के ऑपरेंड का मूल्यांकन किया जाता है। यदि यह मूल्यांकन को अचानक समाप्त करता है, तो असाइनमेंट अभिव्यक्ति के लिए अचानक कारण पूर्ण होती है और कोई असाइनमेंट नहीं होता है।

  • अन्यथा, बाएं हाथ के चर के सहेजे गए मूल्य और दाएं हाथ के ऑपरेंड के मूल्य का उपयोग बाउंडरी ऑपरेशन को यौगिक असाइनमेंट ऑपरेटर द्वारा इंगित करने के लिए किया जाता है। यदि यह ऑपरेशन अचानक समाप्त हो जाता है, तो असाइनमेंट अभिव्यक्ति उसी कारण से अचानक पूर्ण करती है और कोई असाइनमेंट नहीं होता है।

  • अन्यथा, द्विआधारी आपरेशन के परिणाम बाएं हाथ चर के प्रकार, उचित मानक मूल्य सेट (नहीं एक विस्तारित-प्रतिपादक के लिए मान सेट रूपांतरण (§5.1.13) के अधीन में बदल जाती है मान सेट), और रूपांतरण का परिणाम चर में संग्रहीत है।

सबसे महत्वपूर्ण बात यह है कि बाएं हाथ अभिव्यक्ति के मूल्य पहले सहेजा जाता है, तो दाहिने हाथ पूरी तरह से मूल्यांकन किया जाता है है, और फिर यौगिक आपरेशन के परिणाम बाईं तरफ के चर में संग्रहीत किया जाता है हाथ की तरफ।

+0

सही, लेकिन व्यर्थ। यह उन मामलों में से एक है जहां यूबी पूरी तरह से उचित है। – KevinZ

+0

@ केविनज़ आप शायद सी में अपरिभाषित व्यवहार (यूबी) का जिक्र कर रहे हैं। जब जावा की बात आती है तो मैं आपके बयान से असहमत हूं। जावा का दर्शन इसे यथासंभव क्रॉस-प्लेटफॉर्म के रूप में बनाना है। जावा में कोई पूरी तरह से अपरिभाषित व्यवहार नहीं है, हालांकि कुछ व्यवहार है जो विनिर्देशों की सीमाओं के भीतर प्लेटफार्मों के बीच भिन्न हो सकते हैं। सी/सी ++ के लिए डिजाइन दर्शन अलग है। –

22

की जांच i += i++;

i++ साधन i के लिए मूल्य से पढ़ें, फिर i को बढ़ा देते हैं।

i += x का मतलब i का मूल्यांकन करना है, फिर x का मूल्यांकन करें और 2 जोड़ें और परिणाम i में डालें।

तो, क्या होता है:

  • i का मूल्यांकन किया जाता है, यह 0
  • i++ का मूल्यांकन किया जाता है। यह 0 देता है, और i के लिए मान 1
  • i += i++ अब i = 0 + 0 पर सेट है।
  • i = 0

अपने मूल्य को पढ़ने से पहले incrementation के परिणाम प्राप्त करने के ++i साथ प्रयास करें।

1

कोई आश्चर्य की बात है आप अनंत लूप में हो रही है ..

class Demo{ 
    public static void main(String[] args){ 
    int i = 0; 
    for(; ;) { 
     if (i >= 10) 
      break; 
     i = i+i++; 
     System.out.println(i); 
    } 
    } 
} 

ऊपर कोड मान, मैं सिर्फ संकलक क्या विकल्प होगा साथ वेतन वृद्धि के साथ अपने लाइन जगह ले ली है।

अब, शुरुआत में मैं = 0; तो

i = i+i++ 

परिणामों में मैं = 0 + 0 // और अब मैं 1

है, लेकिन अंत में आप फिर से मैं 0 के बराबर है!

इसलिए अनंत

...

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