जावा में, दो वर्णों के एक इंट या चार के अतिरिक्त का परिणाम है?


81

'a' + 'b'इसे जोड़ने पर 195 का उत्पादन होता है। आउटपुट डेटाटाइप charया है int?


3
यदि प्रकार थे charतो मूल्य 'a' + 'b'नहीं होगा 195लेकिन'Ã'
जोरेन

1
यह यहाँ पर 195 है - ideone.com लेकिन ग्रहण में नहीं।
नारंगी

2
आप पढ़ते हैं कि एलगोरिदम से पुस्तक योग्य है! इस अभ्यास के कारण मैं यहाँ आया था;)
जैक ट्वेन

जवाबों:


133

जावा चार्ट, शॉर्ट्स या बाइट्स जोड़ने का परिणाम एक 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')


7

आप निम्नलिखित भावों के बारे में जानना चाह सकते हैं 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 व्यापक आदिम रूपांतरण" पर संक्षिप्त सा पढ़ें।


3

जावा कंपाइलर इसे एक के रूप में व्याख्या कर सकता है।

प्रोग्राम लिखकर और कंपाइलर त्रुटियों की तलाश करके इसे जांचें:

public static void main(String[] args) {
    int result1 = 'a' + 'b';
    char result2 = 'a' + 'b';
}

यदि यह एक चार है, तो पहली पंक्ति मुझे एक त्रुटि देगी और दूसरा नहीं। अगर यह एक इंट है, तो इसके विपरीत होगा।

मैंने इसे संकलित किया और मुझे ..... कोई त्रुटि नहीं मिली। इसलिए जावा दोनों को स्वीकार करता है।

हालाँकि, जब मैंने उन्हें छापा, मुझे मिला:

int: 195

char: Ã

जब आप करते हैं तो क्या होता है:

char result2 = 'a' + 'b'

एक अंतर्निहित रूपांतरण किया जाता है (एक "आदिम संकीर्ण रूपांतरण" इंट से चार तक )।


मुझे आश्चर्य है कि आपको संकीर्णता के कारण सटीक नुकसान के बारे में दूसरे मामले में एक संकलक चेतावनी नहीं मिली।
हॉट लिप्स

@eboix: आप ने लिखा "संकलक स्वचालित रूप से या तो चार या पूर्णांक के लिए डाले" [वैसा] ... कौन सा सही नहीं है क्योंकि एक पूर्णांक एक के लिए नहीं "casted" है पूर्णांक और एक से जा रहा पूर्णांक एक करने के लिए चार नहीं बुलाया जाता है एक "कास्ट" लेकिन एक "संकीर्ण आदिम रूपांतरण"; )
टैक्टिकल

हाँ। मैं यह भी उम्मीद कर रहा था। मैंने वास्तव में मेरे कार्यक्रम का हिस्सा बनाने से पहले मेरे उत्तर का हिस्सा लिख ​​दिया था, लेकिन फिर मैंने इसे देखा कि मैंने कोई चेतावनी या त्रुटियां नहीं देखीं।
eboix

@eboix: eh eh:) मैंने इसे संपादित किया होगा, लेकिन मेरे पास अभी तक 2 000 प्रतिष्ठा अंक नहीं हैं, इसलिए मेरी टिप्पणी एक संपादन के बजाय; )
टैक्टिकल

यदि आप चाहते हैं, तो @ user988052, मैं इसे वापस बदल सकता हूं कि यह क्या था और आप इसे संपादित कर सकते हैं, अंक प्राप्त कर सकते हैं। यदि आपके पास 2000 से कम प्रतिष्ठा बिंदु हैं, तो भी आप इसे संपादित कर सकते हैं। केवल एक चीज यह है कि जिसने पद बनाया है उसे संपादन स्वीकार करना होगा। मैं इसे अभी वापस बदल दूंगा ताकि आप दो बिंदुओं को प्राप्त कर सकें जो आपके लिए सही हैं।
eboix

1

के अनुसार द्विआधारी पदोन्नति नियम , अगर ऑपरेंड के न डबल, नाव या लंबा है, दोनों पूर्णांक के लिए प्रोत्साहित कर रहे हैं। हालांकि, मैं चार प्रकार के संख्यात्मक के रूप में व्यवहार करने के खिलाफ दृढ़ता से सलाह देता हूं, इस तरह का उद्देश्य अपने उद्देश्य को हरा देता है।


1
charएक संख्यात्मक मान के रूप में उपयोग करना पूरी तरह से इसके उद्देश्य के भीतर है, यही वजह है कि जेएलएस इस तरह के उपयोग के लिए बहुत अधिक क्रियाशीलता को समर्पित करता है।
लेव बलोच

1

जब आपके पास पहले से ही सही उत्तर (जेएलएस में संदर्भित) है, तो यहां यह सत्यापित करने के लिए थोड़ा कोड है कि आपको 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करने का प्रयास करने के लिए एक अधिक ठोस सत्यापन है । उत्तरार्द्ध एक संकलन त्रुटि देता है जो प्रभाव में कहता है "आप ए को असाइन नहीं कर सकते हैं "। intcharintchar
स्टीफन सी

0

charUnicodeमूल्यों के रूप में प्रतिनिधित्व किया जाता है और जहां यूनिकोड मूल्यों का प्रतिनिधित्व मूल्यों द्वारा \uकिया जाता Hexadecimalहै।

के रूप में charपदोन्नत मूल्यों पर किसी भी अंकगणितीय संचालन के रूप में int, के परिणाम के 'a' + 'b'रूप में गणना की जाती है

1.) Unicodeइसी charका उपयोग कर पर मूल्यों को लागू करेंUnicode Table

2.) हेक्साडेसिमल को दशमलव रूपांतरण पर लागू करें और फिर Decimalमानों पर ऑपरेशन करें ।

    char        Unicode      Decimal
     a           0061          97
     b           0062          98  +
                              195

Unicode To Decimal Converter

उदाहरण

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    %

यह वह नहीं है जिसके बारे में सवाल पूछ रहा है।
स्टीफन सी

FYI करें, उपरोक्त टिप्पणी के बारे में मेरी विस्तृत प्रतिक्रिया को उन मॉड्स द्वारा हटा दिया गया है, जिन्होंने मेरे जवाब को डिलीट किए गए पोस्ट से माइग्रेशन के पीछे का कारण बताया। यदि मेरी प्रतिक्रिया को SO मॉडरेशन की खामियों को कवर करने के लिए हटा दिया गया है, तो क्या आप कम से कम उपरोक्त टिप्पणी को हटा सकते हैं या दर्शकों को किसी तरह इंगित कर सकते हैं ताकि मुझे दूसरी टिप्पणी लिखने की ज़रूरत न हो? SO mods के प्रश्न
Pavneet_Singh

मैं अपनी टिप्पणी के साथ खड़ा हूं। जैसा कि मैंने आपको उत्तर दिया ... लेकिन फिर हटा दिया गया ... जिस कारण से आपने यह प्रश्न यहां पोस्ट किया है, वह इस तथ्य को नहीं बदलता है कि यह प्रश्न का 95% ऑफ-टॉपिक है, और पहले के उत्तरों का 5% पुनरावृत्ति है। यदि आप अपने व्यर्थ प्रयास के परिणामों को बचाना चाहते हैं, तो इसे अपनी हार्ड ड्राइव पर सहेजना अधिक उचित होगा। या कुछ अन्य प्रश्न खोजें जो इसके लिए प्रासंगिक हैं।
स्टीफन सी

यदि आपके पास मॉडरेटर्स के साथ पकड़ है, तो इसे meta.stackoverflow.com में लें। और सबूत मुहैया कराते हैं। मैं यहां जो कुछ भी करने की कोशिश कर रहा हूं वह सब साफ है >> यह << Q & A।
स्टीफन सी

मैं आपके विचार को समझता हूं, लेकिन एक अतिरिक्त मूल्य के रूप में यूनिकोड रूपांतरण के विवरण को अनदेखा करने के तथ्य को नहीं समझ सकता, जो कुछ पाठकों की मदद कर सकता है, इसलिए मैं इस उत्तर को रखना चाहूंगा (मुझे लगता है कि यह आपके लिए उपयोगी नहीं है और लगता है- विषय)। मैं मेटा और इसी तरह की जगहों से बचता हूं क्योंकि बिना बिजली या समर्थन के ऐसे काम करना आसान नहीं है, जिसमें बहुत समय, प्रयास लगता है। मैं अपनी आंतरिक शांति को बनाए रखना पसंद करता हूं।
पावनीत_सिंह

0

जबकि Boann का उत्तर सही है, एक जटिलता है जो असाइनमेंट संदर्भों में प्रकट होने पर निरंतर अभिव्यक्तियों के मामले पर लागू होती है

निम्नलिखित उदाहरणों पर विचार करें:

  char x = 'a' + 'b';   // OK

  char y = 'a';
  char z = y + 'b';     // Compilation error

क्या हो रहा है? उनका मतलब वही है जो वे नहीं करते हैं? और पहले उदाहरण में inta को असाइन करना कानूनी क्यों है char?

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

  • पहले उदाहरण में, 'a' + 'b'एक स्थिर अभिव्यक्ति है, और इसका मान एक में फिट होगा char, इसलिए संकलक intअभिव्यक्ति के निहित संकुचन को ए की अनुमति देता है char

  • दूसरे उदाहरण में, yएक चर है इसलिए y + 'b'स्थिर अभिव्यक्ति नहीं है। भले ही ब्लाइंड फ्रेडी देख सकते हैं कि मूल्य फिट होगा, संकलक किसी भी अंतर्निहित संकुचन की अनुमति नहीं देता है, और आपको यह कहते हुए एक संकलन त्रुटि मिलती है कि एक intको नहीं सौंपा जा सकता है char

इस संदर्भ में एक अंतर्निहित संकीर्णता वाले आदिम रूपांतरण की अनुमति देने पर कुछ अन्य चेतावनी दी जाती हैं; देख JLS 5.2 और JLS 15.28 पूर्ण विवरण के लिए।

उत्तरार्द्ध एक निरंतर अभिव्यक्ति के लिए आवश्यकताओं को विस्तार से बताता है । यह वह नहीं हो सकता है जो आप सोच सकते हैं। (उदाहरण के लिए, बस की घोषणा yके रूप में finalनहीं मदद करता है।)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.