java समस क्यों मेरे चरित्र एक चरित्र के बजाय एक संख्या के रूप में मुद्रण है?




भारत में प्रिंटिंग प्रेस कौन लाया (3)

आपके प्रश्न का संक्षिप्त उत्तर यह है कि मुद्रित मान उस प्रकार पर आधारित है जो सशर्त अभिव्यक्ति का मूल्यांकन करता है।

तो वास्तव में आपका प्रश्न नीचे उबाल होता है, सशर्त अभिव्यक्ति का प्रकार अलग-अलग क्यों होता है

char y = 'y';
int i = 0;
System.out.print(false ? i : y); // prints 121

तथा

char y = 'y';
System.out.print(false ? 0 : y); // prints y

इसका जवाब देने के लिए, हमें जावा भाषा विशिष्टता के खंड 15.15 पर एक नज़र डालना होगा

जावा में तीन प्रकार की सशर्त अभिव्यक्तियां हैं:

  • बूलियन कंडीशनल एक्सप्रेशन
  • संख्यात्मक कंडीशनल अभिव्यक्ति
  • संदर्भ कंडीशनल अभिव्यक्ति

चूंकि दोनों int और char एक संख्यात्मक प्रकार के लिए परिवर्तनीय हैं, इसलिए अभिव्यक्ति इस नियम के अनुसार एक संख्यात्मक सशर्त अभिव्यक्ति का एक उदाहरण है:

यदि दोनों दूसरे और तीसरे ऑपरैण्ड भाव संख्यात्मक अभिव्यक्ति होते हैं, तो सशर्त अभिव्यक्ति एक संख्यात्मक सशर्त अभिव्यक्ति है।

सशर्त वर्गीकृत करने के उद्देश्य के लिए, निम्नलिखित भाव संख्यात्मक अभिव्यक्तियाँ हैं:

  • एक स्टैंडअलोन फॉर्म की अभिव्यक्ति (§ 15.2) एक प्रकार के साथ जो एक संख्यात्मक प्रकार (§4.2, §5.1.8) के लिए परिवर्तनीय है।

यह देखते हुए, पूरे अभिव्यक्ति के प्रकार का निर्धारण करने के लिए नियम निम्नानुसार दिया गया है:

15.25.2। संख्यात्मक कंडीशनल अभिव्यक्ति

संख्यात्मक सशर्त अभिव्यक्ति स्वसंपूर्ण अभिव्यक्तियां हैं (§15.2)।

एक संख्यात्मक सशर्त अभिव्यक्ति का प्रकार निम्नानुसार निर्धारित होता है:

  • यदि दूसरे और तीसरे ऑपरेटरों का एक ही प्रकार है, तो वह सशर्त अभिव्यक्ति का प्रकार है।

  • यदि दूसरा और तीसरा ऑपरैन्ड में से एक में से एक आदिम प्रकार टी है, और अन्य प्रकार का मुक्केबाजी रूपांतरण (§5.1.7) टी को लागू करने का परिणाम है, तो सशर्त अभिव्यक्ति का प्रकार टी है

  • अगर एक ऑपरेंड प्रकार बाइट या बाइट का होता है और दूसरा प्रकार छोटा या छोटा है, तो सशर्त अभिव्यक्ति का प्रकार छोटा है।

  • यदि किसी एक ऑपरेंड प्रकार टी का होता है जहां टी बाइट, छोटा या चार होता है, और दूसरे ऑपरैण्ड एक निरपेक्ष अभिव्यक्ति (§15.28) प्रकार का होता है जिसका मूल्य टी प्रकार में प्रतिनिधित्व करता है, तो सशर्त अभिव्यक्ति का प्रकार है टी

  • यदि एक ऑपरैन्ड प्रकार टी का होता है, जहां टी बाइट, लघु, या चरित्र होता है, और अन्य ऑपरैण्ड प्रकार का एक निरंतर अभिव्यक्ति होता है जिसका मूल्य प्रकार यू में प्रतिनिधित्व करता है जो कि टी के लिए अनब्लॉकिंग रूपांतरण लागू करने का नतीजा है, तो सशर्त अभिव्यक्ति का प्रकार यू है।

  • अन्यथा, बाइनरी सांख्यिक पदोन्नति (§5.6.2) ऑपरेंड प्रकारों पर लागू होती है, और सशर्त अभिव्यक्ति का प्रकार दूसरे और तीसरे ऑपरेंड का प्रचारित प्रकार है।

ध्यान दें कि द्विआधारी संख्यात्मक पदोन्नति मान सेट रूपांतरण (§5.1.13) करता है और अनब्लॉकिंग रूपांतरण (§5.1.8) कर सकता है।

ध्यान दें कि चौथा नियम बिल्कुल दूसरे उदाहरण का वर्णन करता है; दूसरा परिपथ प्रकार int ( 0 ) का स्थिर होता है और तीसरा एक char , इसलिए सशर्त अभिव्यक्ति char लिए मूल्यांकन करेगी। इससे संकलक को print(char) पद्धति का उपयोग करने का कारण होगा, जो कि प्रिंट करेगा

हालांकि जब आप इसके बजाय एक स्थिर के बजाय एक चर में गुजरते हैं, तो आप अंतिम नियम से नीचे गिर जाते हैं, जिसमें कहा गया है कि "... सशर्त अभिव्यक्ति का प्रकार दूसरे और तीसरे ऑपरेंड का प्रचारित प्रकार है।"

यदि आप जेएलएस के अनुभाग §5.6.2 पर एक नज़र डालें, तो निम्न प्रकार के प्रचार के लिए नियमों का वर्णन निम्नानुसार है:

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

  1. यदि कोई ऑपरेंड किसी संदर्भ प्रकार का है, तो इसे अनबॉक्स्ड रूपांतरण (§5.1.8) के अधीन है।

  2. आदिम रूपांतरण को विस्तारित करना (§5.1.2) को या तो दोनों नियमों को परिवर्तित करने के लिए लागू किया गया है जैसा कि निम्नलिखित नियमों द्वारा निर्दिष्ट किया गया है:

    • यदि कोई ऑपरेंड दो प्रकार का है, तो दूसरे को दो में बदल दिया जाएगा।

    • अन्यथा, यदि कोई ऑपरैंट प्रकार फ्लोट का होता है, तो दूसरे को फ्लोट में कनवर्ट किया जाता है।

    • अन्यथा, यदि कोई ऑपरेंन्ड लंबे प्रकार से होता है, तो दूसरे को लंबे समय तक परिवर्तित किया जाता है।

    • अन्यथा, दोनों ऑपरेंड्स को टाइप करने के लिए int को बदल दिया जाता है।

इन नियमों का पालन करके, अभिव्यक्ति का प्रकार int होगा, और इसलिए संकलक print(int) पद्धति का उपयोग करेगा, जो 121 ( y का आस्की मूल्य) प्रिंट करेगा।

जावा टर्नेटरी ऑपरेटर expression ? statement1 : statement2 expression ? statement1 : statement2 , यदि expression सही है तो statement1 कार्यान्वित किया जाएगा, यदि expression गलत है तो statement2 कार्यान्वित किया जाएगा।

लेकिन जब मैं चलाता हूं:

// some unnecessary codes not displaying
char y = 'y';
int i = 0;
System.out.print(false ? i : y);

मुझे यह प्रिंट करने की उम्मीद है लेकिन इसकी छपाई 121 , क्यों?

संपादित करें मैनुती उत्तर के अनुसार, कंपाइलर int रूप में व्याख्या करता है, लेकिन अगर यह मामला है तो मैं क्यों मरे हुए कोड को देख रहा हूं i ?

अगर मैं System.out.print(false ? 0 : x); करता हूं System.out.print(false ? 0 : x); तो मैं y मिल रहा हूं, इसलिए इस मामले में कंपाइलर int रूप में व्याख्या क्यों नहीं करता?


121 चरित्र y का पूर्णांक प्रतिनिधित्व है। चूंकि आपने अभिव्यक्ति के भाग के रूप में i प्रदान किया है, इसलिए कंपाइलर इसे System.out.print(int) बजाय System.out.print(char) लिए कॉल के रूप में व्याख्या करता है।

ध्यान दें कि System.out.print(false ? (char)i : y); बदलना System.out.print(false ? (char)i : y); प्रिंट करता है y


121 y के लिए एएससीआईआई कोड है और जैसा कि आपने I को एक पूर्णांक के रूप में घोषित किया है, कंपाइलर y को भी वही चर के रूप में व्याख्या करता है I इस प्रकार y के लिए एएससीआईआई मूल्य छपाई लेखन System.out.print (गलत? (चार) i: y) प्रिंट करेगा y







int