java - जावा का+=,-=,*=,/= यौगिक असाइनमेंट ऑपरेटरों को कास्टिंग की आवश्यकता क्यों नहीं है?




casting operators (7)

आपको i = i + l मामले में explicitly से long से int long कास्ट करने की आवश्यकता है, तो यह संकलित और सही आउटपुट देगा। पसंद

i = i + (int)l;

या

i = (int)((long)i + l); // this is what happens in case of += , dont need (long) casting since upper casting is done implicitly.

लेकिन += मामले में यह ठीक काम करता है क्योंकि ऑपरेटर सही प्रकार के प्रकार से दाएं चर के प्रकार से टाइप कास्टिंग करता है, इसलिए स्पष्ट रूप से डालने की आवश्यकता नहीं है।

आज तक, मैंने सोचा कि उदाहरण के लिए:

i += j;

सिर्फ एक शॉर्टकट था:

i = i + j;

लेकिन अगर हम इसे आजमाते हैं:

int i = 5;
long j = 8;

फिर i = i + j; संकलित नहीं करेंगे लेकिन i += j; ठीक संकलित करेंगे।

क्या इसका मतलब यह है कि वास्तव में i += j; इस तरह कुछ के लिए शॉर्टकट i = (type of i) (i + j) ?


इस कास्टिंग का एक अच्छा उदाहरण * = या / = का उपयोग कर रहा है

byte b = 10;
b *= 5.7;
System.out.println(b); // prints 57

या

byte b = 100;
b /= 2.5;
System.out.println(b); // prints 40

या

char ch = '0';
ch *= 1.1;
System.out.println(ch); // prints '4'

या

char ch = 'A';
ch *= 1.5;
System.out.println(ch); // prints 'a'

जावा प्रकार रूपांतरण स्वचालित रूप से निष्पादित होते हैं जब असाइनमेंट ऑपरेशन के दाईं ओर अभिव्यक्ति के प्रकार को असाइनमेंट के बाईं ओर चर के प्रकार के लिए सुरक्षित रूप से प्रचारित किया जा सकता है। इस प्रकार हम सुरक्षित रूप से असाइन कर सकते हैं:

 byte -> short -> int -> long -> float -> double. 

वही दूसरी तरफ काम नहीं करेगा। उदाहरण के लिए हम स्वचालित रूप से लंबे समय तक एक int को परिवर्तित नहीं कर सकते हैं क्योंकि पहले को दूसरे की तुलना में अधिक संग्रहण की आवश्यकता होती है और परिणामस्वरूप जानकारी खो सकती है। इस तरह के एक रूपांतरण को मजबूर करने के लिए हमें एक स्पष्ट रूपांतरण करना होगा।
प्रकार - रूपांतरण


बहुत अच्छा सवाल है। जावा भाषा विनिर्देश आपके सुझाव की पुष्टि करता है।

उदाहरण के लिए, निम्नलिखित कोड सही है:

short x = 3;
x += 4.6;

और x में मान 7 होने का परिणाम है क्योंकि यह इसके बराबर है:

short x = 3;
x = (short)(x + 4.6);

यहां समस्या टाइप कास्टिंग शामिल है।

जब आप int और long जोड़ते हैं,

  1. Int ऑब्जेक्ट को लंबे समय तक डाला जाता है और दोनों जोड़े जाते हैं और आपको लंबी वस्तु मिलती है।
  2. लेकिन लंबी वस्तु को अंतर्निहित रूप से int में नहीं डाला जा सकता है। तो, आपको इसे स्पष्ट रूप से करना है।

लेकिन += इस तरह से कोडित किया गया है कि यह कास्टिंग प्रकार करता है। i=(int)(i+m)


यहां सूक्ष्म बिंदु ...

i+j लिए एक अंतर्निहित टाइपकास्ट है जब j डबल है और i एक int है। जब जावा उनके बीच एक ऑपरेशन होता है तो जावा हमेशा एक पूर्णांक को दोहराता है।

i+=j को स्पष्ट करने के लिए जहां i एक पूर्णांक है और j एक डबल को वर्णित किया जा सकता है

i = <int>(<double>i + j)

देखें: निहित कास्टिंग का यह विवरण

आप इस मामले में स्पष्टता के लिए j (int) टाइप करना चाहते हैं।


हाँ,

मूल रूप से जब हम लिखते हैं

i += l; 

संकलक इसे बदल देता है

i = (int)(i + l);

मैंने बस .class फ़ाइल कोड की जांच की है।

वास्तव में जानना एक अच्छी बात है






assignment-operator