2012-02-07 5 views
8

किसी को भी मेरे लिए इस व्याख्या कर सकते हैं,अजीब व्यवहार जावा + = ऑपरेटर

String str = "Hello"; 

str += ((char)97) +2; // str = "Hello99"; 

str = str +((char)97)+2; // str = "Helloa2"; 

+= ऑपरेटर दाईं ओर का मूल्यांकन करता है पहले तो यह बाईं ओर के साथ इसे जोड़?

उत्तर

11

अंतर संचालन के आदेश के साथ करना है। निम्नलिखित:

str = str + (((char)97) + 2); 

दूसरी ओर, निम्नलिखित:

str += ((char)97) +2; 

के बराबर है

str = (str + ((char)97)) + 2; 

नोट अंतर:

str = str +((char)97)+2; 

के बराबर है कोष्ठक के प्लेसमेंट में।

अब चलो दो मामलों पर विचार करते हैं:

1) str = str + (((char)97) + 2):

यहाँ, 97 + 2 पहले मूल्यांकन किया जाता है। परिणाम int (99) है, जो स्ट्रिंग में परिवर्तित हो गया है और str में जोड़ा गया है। परिणाम "Hello99" है।

2) str = (str + ((char)97)) + 2:

यहाँ, (char)97 ('a') स्ट्रिंग में जोड़ा जाता है, और फिर 2 परिणाम के लिए स्ट्रिंग में बदल जाती है और जोड़ दिया जाता है। यह "Helloa2" देता है।

2

यह सब ऑपरेटर सहयोगीता के बारे में है।

str += ((char)97) +2; 

अनुवाद होगा करने के लिए:

str = str + (((char)97)+2); 
1

लिए आपका पहला कदम के बराबर है:

str = (str + ((char)97)) + 2 
1
str = str +((char)97)+2 
:

str = str + ((char)97) + 2); 

हुए अपने दूसरे के बराबर है

क्योंकि पहली स्ट्रिंग '+' ऑपरेटर स्ट्रिंग concat के रूप में प्रयोग किया जाता है (अन्य मूल्यों स्ट्रिंग में बदल रही हैं)

str +=((char)97)+2 

पहले दाईं ओर 99 (दो बाइट राशि) के लिए मूल्यांकन किया जाता है है की तुलना में str + 99 -> स्ट्रिंग concat

5

हां। जेएलएस का प्रासंगिक खंड यहां है: http://java.sun.com/docs/books/jls/first_edition/html/15.doc.html#5304

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

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

(मेरे द्वारा जोर।)