2015-06-18 15 views
6

this table के अनुसार, ++ को सहयोगीता छोड़ने का अधिकार है। तो, मैं इस कोड को चलाएँ:इस ऑपरेटर सहयोगीता को कैसे समझाया जाए?

int a = 5; 
++a + ++a * ++a 

और उम्मीद अभिव्यक्ति 50 होने के लिए (8 + 7 * 6 के रूप में, वेतन वृद्धि दाएं से बाएं से शुरू होता है)। लेकिन अभिव्यक्ति का मूल्यांकन ग्रहण द्वारा बाएं से दाएं() से किया जाता है, और परिणाम 62 देता है। मैं जावा में इस सहयोगीता के लिए नया हूं, और कुछ स्पष्ट याद आना चाहिए। कृपया इस अजीब व्यवहार को समझने में मेरी मदद करें।

संपादित करें: आपके उत्तरों के लिए धन्यवाद, लेकिन मेरे पास अब एक और सवाल है। यह है कि, जैसा कि @ बिज़क्लोप के कोड और पेड़ के उत्तर से देखा गया है, यह स्पष्ट है कि ++ के लिए सहयोगी कोई फर्क नहीं पड़ता। फिर, कोई++/-- की इस सहयोगीता के लिए उपयोग केस है?

+3

सहयोगीता! = प्राथमिकता। प्राथमिकता पहले आती है, सहयोगीता केवल उन मामलों को हल करने के लिए उपयोग की जाती है जहां ऑपरेटरों की समान प्राथमिकता होती है। – biziclop

+1

मैं ऐसे उदाहरण के बारे में नहीं सोच सकता जहां '++ '/' - ऑपरेटरों की साझेदारी महत्वपूर्ण है, शायद कोई नहीं है। – biziclop

उत्तर

12

वहाँ दो अलग बातें यहाँ मिश्रित कर रहे हैं हो जाएगा।

आइए अभिव्यक्ति के साथ शुरू करें: ++a + ++a * ++a। हमें इसके साथ पहले क्या करना है? चूंकि ऑपरेटरों + और * की आवश्यकता है दो ऑपरेटरों और ++ की आवश्यकता है, हमें यह पता लगाना होगा कि कौन सा ऑपरेंड किस ऑपरेशन के साथ जाता है। यह अभिव्यक्ति पार्सिंग चरण है, जहां प्राथमिकता/सहयोगीता लागू की जाती है।

  1. ++ सर्वोच्च प्राथमिकता है, इसलिए के रूप में (++a) + (++a) * (++a)
  2. आगे यह * है हम अपने अभिव्यक्ति को फिर से लिखने सकते हैं, तो फिर हम कोष्ठकों जोड़ सकते हैं: (++a) + ((++a) * (++a))
  3. और अंत में हम +, सभी का सबसे कम पूर्वता है , इसलिए समरूपता की खातिर हम लिख सकते हैं: ((++a) + ((++a) * (++a)))

ध्यान दें कि हम बड़े करीने से एक पेड़ के रूप में इस का प्रतिनिधित्व कर सकते हैं:

+ 
/\ 
++ * 
| | \ 
a ++ ++ 
    | | 
    a a 

तो यह हमारा मूल्यांकन पेड़ प्राथमिकता और सहयोगीता के आधार पर है।

ध्यान दें कि इस मामले में सहयोगीता कोई फर्क नहीं पड़ता क्योंकि सभी ऑपरेटर की अलग-अलग प्राथमिकता थी। अगर हमारी अभिव्यक्ति 4 - 1 - 3 + 2 थी, तो (((4 - 1) - 3) + 2) तक पहुंचने के लिए सहयोगीता का उपयोग करना महत्वपूर्ण होगा, + और - समान प्राथमिकता है।

अब अगला कदम, मूल्यांकन आता है। मूल्यांकन हमेशा बाएं से दाएं (असाइनमेंट के लिए भी, हालांकि नियम थोड़ा विचित्र हैं) होता है, लेकिन यह हमारे द्वारा बनाए गए पेड़ का उपयोग करके बाएं से दाएं होता है।

  1. तो सबसे पहले हम + ऑपरेटर का मूल्यांकन करना शुरू करते हैं, क्योंकि यह शीर्ष पर है।
  2. हम तो एक स्तर नीचे बाईं ओर, जाने के रूप में हम + ऑपरेटर की बाईं ओर ++a का मूल्यांकन, (6)
  3. तो हम सही करने के लिए जाने के लिए और * आपरेशन का मूल्यांकन शुरू करते हैं।
  4. जिस तरह से हम यह मूल्यांकन करने के लिए दूसरा ++a, (7)
  5. फिर तीसरे ++a(8)
  6. और फिर हम चरण 4 और 5 का परिणाम गुणा (यह है * आपरेशन का मूल्यांकन), (56)
  7. और अंत में हम कदम 2 (62)
के परिणाम के चरण 6 का परिणाम जोड़ने

... और हम कर चुके हैं।

टी एल; डॉ: पूर्वता और संबद्धता निर्धारित जहाँ कोष्ठक डाल करने के लिए, लेकिन मूल्यांकन हमेशा बाएँ-से-सही है।

15.7. Evaluation Order

जावा प्रोग्रामिंग भाषा गारंटी देता है कि ऑपरेटरों के ऑपरेंड दिखाई एक विशिष्ट मूल्यांकन के क्रम में मूल्यांकन करने के लिए किया जा, अर्थात्, बाएं से दाएं।

+0

बढ़िया! वास्तव में मुझे क्या चाहिए। मैं हमेशा इस पेड़ विधि का उपयोग कर सभी अभिव्यक्तियों का मूल्यांकन करूंगा! –

+0

मेरे पास एक और सवाल है, मैंने इसके लिए सवाल संपादित किया। कृपया देखें। –

3

ऐसा इसलिए है क्योंकि गुणात्मक ऑपरेटर *+ ऑपरेटर के अतिरिक्त उच्च प्राथमिकता है। अभिव्यक्ति पार्स करने और अभिव्यक्ति मूल्यांकन:

गणना ++a + (++a * ++a) = 6 + 7 * 8

+0

आपके उत्तर के लिए धन्यवाद! मेरे पास एक और सवाल है, मैंने इसके लिए सवाल संपादित किया। कृपया देखें। –

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