2012-12-19 25 views
23

संभव डुप्लिकेट:
Java += operatorजावा वृद्धि ऑपरेटर क्यों स्पष्ट कलाकारों के बिना संकुचन संचालन की अनुमति देता है?

जावा में, यह मान्य नहीं है (संकलन नहीं करता है), के रूप में उम्मीद है:

long lng = 0xffffffffffffL; 
int i; 
i = 5 + lng; //"error: possible loss of magnitude" 

लेकिन यह बिल्कुल ठीक है (?)

long lng = 0xffffffffffffL; 
int i = 5; 
i += lng;  //compiles just fine 

यह स्पष्ट रूप से एक संकुचित ऑपरेशन है, जो संभवतः int सीमा से अधिक हो सकता है। तो संकलक शिकायत क्यों नहीं करता है?

+1

के बराबर है। –

उत्तर

4

i += lng; यौगिक असाइनमेंट ऑपरेटर कास्ट स्पष्ट रूप से।

i+=lng; 
is same as 
i = int(i+lng); 
JLS से

:

रूप E1 सेशन की एक यौगिक काम अभिव्यक्ति = E2 E1 = (टी) ((ई 1) सेशन (E2)), के बराबर है जहां टी है ई 1 का प्रकार, सिवाय इसके कि E1 का मूल्यांकन केवल एक बार किया जाता है।

+1

तो ऐसा लगता है, लेकिन क्यों? ऐसा लगता है कि मुझे भाषा की गलती के खिलाफ जाना है। –

+0

@ क्रिस्टीडायोनोस्को, यह अंतर्निहित कास्ट त्रुटियों के बिना होता है क्योंकि इसे स्पष्ट करने के लिए कोई वाक्यविन्यास उपलब्ध नहीं है। उदाहरण के लिए आप अन्यथा एक पूर्णांक '* = 1.5' करने में सक्षम नहीं होंगे। – Robert

14

यह JLS #15.26.2 में परिभाषित किया गया है:

रूप E1 op= E2 का एक यौगिक काम अभिव्यक्ति E1 = (T) ((E1) op (E2)), जहां T, E1 के प्रकार है कि E1 को छोड़कर केवल एक बार मूल्यांकन किया जाता है के बराबर है।

दूसरे शब्दों में, i += lng निहित रूप से एक कलाकार का प्रदर्शन करता है।

+0

जेलस नहीं, लेकिन मैंने कहा कि मेरे जवाब में एक ही डर्न चीज एक मिनट है और मुझे कोई प्रतिनिधि नहीं मिला ..: पी – PermGenError

+2

@GanGnaMStYleOverFlowErroR आपने अभी ओपी के सवाल को दोहराया है।जेएलएस को संदर्भित करने के लिए assylias ऊपर उठाया गया। आपके विरोध में, उन्होंने पोस्ट किया कि ** पहले ** संशोधन में, और इसे पोस्ट करने वाला पहला व्यक्ति था; वहां पहुंचने के लिए आपको लगभग 5 संशोधन की आवश्यकता थी (और केवल दूसरों के उत्तरों को देखने के बाद)। –

+0

@GanGnaMStYleOverFlowErroR इसके बारे में क्षमा करें - लेकिन मैं निश्चित रूप से 3 टोपी देने के लिए नहीं जा रहा हूं ;-) – assylias

3

संकलक क्योंकि शिकायत नहीं है, JLS §15.26.2. Compound Assignment Operators के अनुसार:

रूप E1 op= E2 का एक यौगिक काम अभिव्यक्ति E1 = (T) ((E1) op (E2)), जहां T, E1 के प्रकार है कि E1 को छोड़कर केवल एक बार मूल्यांकन किया जाता है के बराबर है।

इस प्रकार,

i += lng; 

यह सवाल एक स्पष्ट जवाब के बजाय चर्चा आमंत्रित किया है

i = (int)(i + lng);