'a' + 'b'
इसे जोड़ने पर 195 का उत्पादन होता है। आउटपुट डेटाटाइप char
या है int
?
'a' + 'b'
इसे जोड़ने पर 195 का उत्पादन होता है। आउटपुट डेटाटाइप char
या है int
?
जवाबों:
जावा चार्ट, शॉर्ट्स या बाइट्स जोड़ने का परिणाम एक int है :
बाइनरी न्यूमेरिक प्रमोशन पर जावा भाषा की विशिष्टता :
- यदि कोई भी ऑपरेंड एक संदर्भ प्रकार का है, तो अनबॉक्सिंग रूपांतरण (.85.1.8) किया जाता है। फिर:
- यदि कोई ऑपरेंड टाइप डबल का है, तो दूसरा डबल में बदल जाता है।
- अन्यथा, यदि या तो ऑपरेंड प्रकार फ्लोट का है, तो दूसरा फ्लोट में बदल जाता है।
- अन्यथा, यदि या तो ऑपरेंड प्रकार का लंबा है, तो दूसरे को लंबे में बदल दिया जाता है।
- अन्यथा, दोनों ऑपरेंड को int टाइप करने के लिए कनवर्ट किया जाता है।
लेकिन ध्यान दें कि यह यौगिक असाइनमेंट ऑपरेटरों के बारे में क्या कहता है (जैसे + =) :
बाइनरी ऑपरेशन का परिणाम बाएं-बाएं चर के प्रकार में बदल जाता है ... और रूपांतरण का परिणाम चर में संग्रहीत होता है।
उदाहरण के लिए:
char x = 1, y = 2;
x = x + y; // compile error: "possible loss of precision (found int, required char)"
x = (char)(x + y); // explicit cast back to char; OK
x += y; // compound operation-assignment; also OK
एक तरह से आप परिणाम के प्रकार का पता लगा सकते हैं, सामान्य तौर पर, इसे किसी ऑब्जेक्ट में डालना है और यह पूछना है कि यह किस वर्ग का है:
System.out.println(((Object)('a' + 'b')).getClass());
// outputs: class java.lang.Integer
यदि आप प्रदर्शन में रुचि रखते हैं, तो ध्यान दें कि जावा बाइटकोड में छोटे डेटा प्रकारों के साथ अंकगणित के लिए समर्पित निर्देश भी नहीं हैं। उदाहरण के लिए, जोड़ने के लिए, निर्देश iadd
(ints), ladd
(longs के लिए), fadd
(तैरने के लिए), dadd
(युगल के लिए), और यह है। x += y
छोटे प्रकारों के साथ अनुकरण करने के लिए , कंपाइलर उपयोग करेगा iadd
और फिर इंस्ट्रक्शन के ऊपरी बाइट्स को शून्य करेगा i2c
( जैसे "इंट टू चर")। यदि मूल सीपीयू में 1-बाइट या 2-बाइट डेटा के लिए निर्देश समर्पित हैं, तो यह रन टाइम के लिए अनुकूलित करने के लिए जावा वर्चुअल मशीन पर निर्भर है।
यदि आप वर्णों को एक संख्यात्मक प्रकार के रूप में व्याख्या करने के बजाय स्ट्रिंग के रूप में संक्षिप्त करना चाहते हैं, तो ऐसा करने के बहुत सारे तरीके हैं। सबसे आसान अभिव्यक्ति में एक खाली स्ट्रिंग जोड़ रहा है, क्योंकि एक स्ट्रिंग में एक चार और एक स्ट्रिंग जोड़ने के परिणामस्वरूप। इन सभी अभिव्यक्तियों का परिणाम स्ट्रिंग में है "ab"
:
'a' + "" + 'b'
"" + 'a' + 'b'
(यह काम करता है क्योंकि "" + 'a'
पहले मूल्यांकन किया जाता है; यदि ""
आप इसके बजाय अंत में थे तो आपको मिलेगा "195"
)new String(new char[] { 'a', 'b' })
new StringBuilder().append('a').append('b').toString()
String.format("%c%c", 'a', 'b')
बाइनरी अंकगणितीय संचालन char
और byte
(और short
) को बढ़ावा देता है int
- जेएलएस 5.6.2।
आप निम्नलिखित भावों के बारे में जानना चाह सकते हैं char
।
char c='A';
int i=c+1;
System.out.println("i = "+i);
यह जावा और रिटर्न में पूरी तरह से मान्य है 66
, चरित्र (यूनिकोड) के अनुरूप मूल्य c+1
।
String temp="";
temp+=c;
System.out.println("temp = "+temp);
यह जावा में बहुत मान्य है और स्ट्रिंग प्रकार चर temp
स्वचालित रूप c
से प्रकार के चार्ट को स्वीकार करता है और temp=A
कंसोल पर उत्पन्न होता है।
निम्नलिखित सभी कथन जावा में भी मान्य हैं!
Integer intType=new Integer(c);
System.out.println("intType = "+intType);
Double doubleType=new Double(c);
System.out.println("doubleType = "+doubleType);
Float floatType=new Float(c);
System.out.println("floatType = "+floatType);
BigDecimal decimalType=new BigDecimal(c);
System.out.println("decimalType = "+decimalType);
Long longType=new Long(c);
System.out.println("longType = "+longType);
हालाँकि c
, एक प्रकार का है char
, इसे संबंधित कंस्ट्रक्टरों में कोई त्रुटि नहीं दी जा सकती है और उपरोक्त सभी कथनों को मान्य कथन माना जाता है। वे क्रमशः निम्नलिखित आउटपुट का उत्पादन करते हैं।
intType = 65
doubleType = 65.0
floatType = 65.0
decimalType = 65
longType =65
char
एक आदिम संख्यात्मक अभिन्न प्रकार है और जैसे कि रूपांतरण और प्रचार सहित इन जानवरों के सभी नियमों के अधीन है। आप इस पर पढ़ना चाहेंगे, और JLS इसके लिए सबसे अच्छे स्रोतों में से एक है: रूपांतरण और प्रचार । विशेष रूप से, "5.1.2 व्यापक आदिम रूपांतरण" पर संक्षिप्त सा पढ़ें।
जावा कंपाइलर इसे एक के रूप में व्याख्या कर सकता है।
प्रोग्राम लिखकर और कंपाइलर त्रुटियों की तलाश करके इसे जांचें:
public static void main(String[] args) {
int result1 = 'a' + 'b';
char result2 = 'a' + 'b';
}
यदि यह एक चार है, तो पहली पंक्ति मुझे एक त्रुटि देगी और दूसरा नहीं। अगर यह एक इंट है, तो इसके विपरीत होगा।
मैंने इसे संकलित किया और मुझे ..... कोई त्रुटि नहीं मिली। इसलिए जावा दोनों को स्वीकार करता है।
हालाँकि, जब मैंने उन्हें छापा, मुझे मिला:
int: 195
char: Ã
जब आप करते हैं तो क्या होता है:
char result2 = 'a' + 'b'
एक अंतर्निहित रूपांतरण किया जाता है (एक "आदिम संकीर्ण रूपांतरण" इंट से चार तक )।
के अनुसार द्विआधारी पदोन्नति नियम , अगर ऑपरेंड के न डबल, नाव या लंबा है, दोनों पूर्णांक के लिए प्रोत्साहित कर रहे हैं। हालांकि, मैं चार प्रकार के संख्यात्मक के रूप में व्यवहार करने के खिलाफ दृढ़ता से सलाह देता हूं, इस तरह का उद्देश्य अपने उद्देश्य को हरा देता है।
char
एक संख्यात्मक मान के रूप में उपयोग करना पूरी तरह से इसके उद्देश्य के भीतर है, यही वजह है कि जेएलएस इस तरह के उपयोग के लिए बहुत अधिक क्रियाशीलता को समर्पित करता है।
जब आपके पास पहले से ही सही उत्तर (जेएलएस में संदर्भित) है, तो यहां यह सत्यापित करने के लिए थोड़ा कोड है कि आपको int
दो char
एस जोड़ते समय मिलेगा ।
public class CharAdditionTest
{
public static void main(String args[])
{
char a = 'a';
char b = 'b';
Object obj = a + b;
System.out.println(obj.getClass().getName());
}
}
आउटपुट है
java.lang.Integer
int
और Integer
समान चीजें नहीं हैं। वेरिएबल या वैरिएबल को असाइन a + b
करने का प्रयास करने के लिए एक अधिक ठोस सत्यापन है । उत्तरार्द्ध एक संकलन त्रुटि देता है जो प्रभाव में कहता है "आप ए को असाइन नहीं कर सकते हैं "। int
char
int
char
char
Unicode
मूल्यों के रूप में प्रतिनिधित्व किया जाता है और जहां यूनिकोड मूल्यों का प्रतिनिधित्व मूल्यों द्वारा \u
किया जाता Hexadecimal
है।
के रूप में char
पदोन्नत मूल्यों पर किसी भी अंकगणितीय संचालन के रूप में int
, के परिणाम के 'a' + 'b'
रूप में गणना की जाती है
1.) Unicode
इसी char
का उपयोग कर पर मूल्यों को लागू करेंUnicode Table
2.) हेक्साडेसिमल को दशमलव रूपांतरण पर लागू करें और फिर Decimal
मानों पर ऑपरेशन करें ।
char Unicode Decimal
a 0061 97
b 0062 98 +
195
उदाहरण
0061
(0 * 16 3 ) + (0 * 16 2 ) + (6 * 16 1 ) + (1 * 16 0 )
(0 * 4096) + (0 * 256) + (6 * 16) + (1 * 1)
0 + 0 + 96 + 1 = 97
0062
(0 * 16 3 ) + (0 * 16 2 ) + (6 * 16 1 ) + (2 * 16 0 )
(0 * 4096) + (0 * 256) + (6 * 16) + (2 * 1)
0 + 0 + 96 + 2 = 98
इसलिये 97 + 98 = 195
उदाहरण 2
char Unicode Decimal
Ջ 054b 1355
À 00c0 192
--------
1547 +
1163 -
7 /
260160 *
11 %
जबकि Boann का उत्तर सही है, एक जटिलता है जो असाइनमेंट संदर्भों में प्रकट होने पर निरंतर अभिव्यक्तियों के मामले पर लागू होती है ।
निम्नलिखित उदाहरणों पर विचार करें:
char x = 'a' + 'b'; // OK
char y = 'a';
char z = y + 'b'; // Compilation error
क्या हो रहा है? उनका मतलब वही है जो वे नहीं करते हैं? और पहले उदाहरण में int
a को असाइन करना कानूनी क्यों है char
?
जब असाइनमेंट संदर्भ में एक स्थिर अभिव्यक्ति दिखाई देती है, तो जावा कंपाइलर अभिव्यक्ति के मूल्य की गणना करता है और देखता है कि क्या यह उस प्रकार की सीमा में है जिसे आप असाइन कर रहे हैं। यदि यह है, तो एक अंतर्निहित संकीर्ण आदिम रूपांतरण लागू होता है।
पहले उदाहरण में, 'a' + 'b'
एक स्थिर अभिव्यक्ति है, और इसका मान एक में फिट होगा char
, इसलिए संकलक int
अभिव्यक्ति के निहित संकुचन को ए की अनुमति देता है char
।
दूसरे उदाहरण में, y
एक चर है इसलिए y + 'b'
स्थिर अभिव्यक्ति नहीं है। भले ही ब्लाइंड फ्रेडी देख सकते हैं कि मूल्य फिट होगा, संकलक किसी भी अंतर्निहित संकुचन की अनुमति नहीं देता है, और आपको यह कहते हुए एक संकलन त्रुटि मिलती है कि एक int
को नहीं सौंपा जा सकता है char
।
इस संदर्भ में एक अंतर्निहित संकीर्णता वाले आदिम रूपांतरण की अनुमति देने पर कुछ अन्य चेतावनी दी जाती हैं; देख JLS 5.2 और JLS 15.28 पूर्ण विवरण के लिए।
उत्तरार्द्ध एक निरंतर अभिव्यक्ति के लिए आवश्यकताओं को विस्तार से बताता है । यह वह नहीं हो सकता है जो आप सोच सकते हैं। (उदाहरण के लिए, बस की घोषणा y
के रूप में final
नहीं मदद करता है।)
char
तो मूल्य'a' + 'b'
नहीं होगा195
लेकिन'Ã'