क्यों एक चर चर 'ab' के असाइनमेंट से 'बी' मिलता है, बल्कि 'ए'?एक चर चर के लिए बहु-वर्ण चार निरंतर असाइन करने के परिणाम का निर्धारण कैसे करें?
char c = 'ab';
printf("c: %c\n", c);
प्रिंटों:
c: b
क्यों एक चर चर 'ab' के असाइनमेंट से 'बी' मिलता है, बल्कि 'ए'?एक चर चर के लिए बहु-वर्ण चार निरंतर असाइन करने के परिणाम का निर्धारण कैसे करें?
char c = 'ab';
printf("c: %c\n", c);
प्रिंटों:
c: b
यह कार्यान्वयन पहले के उत्तरों के रूप में परिभाषित किया गया है।
मेरा जीसीसी एक int के रूप में 'ab' को संभालता है। निम्नलिखित कोड:
printf("sizeof('ab') = %zu \n", sizeof('ab'));
printf("'ab' = 0x%08x \n", 'ab');
printf("'abc' = 0x%08x \n", 'abc');
प्रिंट:
sizeof('ab') = 4
'ab' = 0x00006162
'abc' = 0x00616263
अपने कोड में, पंक्ति:
char c = (char)(0x00006162 & 0xFF);
तो सी हो जाता है:
char c = 'ab';
के रूप में माना जा सकता है 'ab' के अंतिम चार का मूल्य। इस मामले में यह 'बी' (0x62) है।
क्योंकि 'ab'
int
टाइप किया है और एक char
केवल एक बाइट पकड़ कर सकते हैं।
एक पूर्णांक बहु चरित्र निरंतर का मूल्य, कार्यान्वयन परिभाषित किया गया है C11 मानक (§6.4.4.4 "वर्ण स्थिरांक" AL10 p69) के अनुसार:
10 - [...] एक पूर्णांक वर्ण स्थिरांक का मान जिसमें एक से अधिक वर्ण होते हैं (उदाहरण के लिए, 'ab'), या एक वर्ण या भागने वाला अनुक्रम होता है जो एकल-बाइट निष्पादन वर्ण को मैप नहीं करता है, कार्यान्वयन-परिभाषित है। [...]
सी 9 0 और सी 99 मानकों का एक ही नियम है। –
मानक के अनुसार, यह कार्यान्वयन परिभाषित किया गया है। से 6.4.4.4 चरित्र स्थिरांक:
एक पूर्णांक चरित्र निरंतर प्रकार int है। एक पूर्णांक वर्ण निरंतर का मान एक एकल वर्ण जिसमें एक एकल बाइट निष्पादन वर्ण को मानचित्रित किया गया है एक पूर्णांक के रूप में व्याख्या किए गए मैप किए गए वर्ण के प्रतिनिधित्व का संख्यात्मक मान है। एक से अधिक वर्ण (उदा।, 'ab') वाले एक पूर्णांक वर्ण स्थिरांक का मान, या एक वर्ण या भागने वाला अनुक्रम जिसमें एकल-बाइट निष्पादन वर्ण को मैप नहीं किया गया है, कार्यान्वयन-परिभाषित है।
@ouah, यह कैसे नहीं करता? यह बता रहा है कि यह कार्यान्वयन पर निर्भर करता है कि यह एक बहु-अक्षर शाब्दिक को कितना 'int' मान निर्दिष्ट करता है। – hmjd
@ouah इससे कोई फ़र्क नहीं पड़ता कि एक वर्ण के स्थिरता का मूल्य क्या है, 'बी' अभी भी 'बी' के रूप में दर्शाया गया है। यह उत्तर प्रश्न का उत्तर देता है कि 'ए' के बजाय 'बी' क्यों (अर्थात्, यह कार्यान्वयन पर निर्भर है), जिसका उत्तर भी स्पर्श नहीं करता है। –
@ जिमबाल्टर वास्तव में ओपी ने अपने प्रश्न को 'ए' के बजाय * जोड़ने के लिए संपादित किया है, जो आईएमएचओ मूल प्रश्न के इरादे को थोड़ा सा बदलता है। – ouah
बाद में संपादित करें: मेरा उत्तर उन लोगों के लिए पूरक था जो स्पष्ट रूप से स्पष्ट रूप से बताए गए थे कि यह कार्यान्वयन विशिष्ट व्यवहार है। मैं इस धारणा के तहत था कि ओपी जानना चाहता था, इस बात को ध्यान में रखते हुए, कंपाइलर ने 'ए' को 'ए' पर क्यों चुना। क्षमा करें अगर मेरा जवाब उलझन में था।
एंडियनस। यही कारण है कि आप 'ए' के बजाय 'बी' प्राप्त करते हैं। आपकी मशीन की स्मृति में इसका प्रतिनिधित्व कैसे किया जाता है। और आपकी मशीन शायद थोड़ा एंडियन है।
इसे स्पार्क या मिप्सबे या आर्म पर आज़माएं और आपको 'बी' के बजाय 'ए' मिल सकता है।
किसी भी मामले में मुझे आशा है कि आप वास्तविक उत्पादन कोड के लिए इस पर निर्भर नहीं हैं।
कोई भी अंतहीनता नहीं। यहां तक कि मूल्य में वर्णों का क्रम भी अनिर्धारित है। एक ही एंडियन के साथ विभिन्न कंपाइलर्स अलग-अलग प्रतिनिधित्व (उदाहरण के लिए जीसीसी बनाम विजुअल स्टूडियो) का उपयोग करते हैं। वास्तव में – Suma
। लेकिन मैंने सोचा कि पहले से ही जवाबों से पहले ही सुलझा लिया गया था। मैं केवल यह स्पष्ट करने की कोशिश कर रहा था कि क्यों ओपी को अपने परीक्षण में 'बी' की बजाय 'बी' मिल सकती है। संकलक उस प्लेटफार्म के आधार पर इसका प्रतिनिधित्व करने और उस तक पहुंचने का आसान तरीका चुन सकता है। –
यह सवाल का जवाब नहीं देता है, यही कारण है कि इसे 'ए' के बजाय 'बी' मिलता है, न कि इसे 'ab' के बजाय 'बी' क्यों मिलता है। –
@JimBalter प्रश्न संपादित किया गया था और उस समय मैंने 'ए' के बजाय * नहीं किया था। – ouah
पीएस चूंकि यह एक सी प्रश्न है, '' ए 'और' 'बी' में टाइप 'int' भी है। –