2016-02-09 11 views
8

स्क्रीन पर printf क्या लिखेंगे?आकार (char + char) 4 क्यों लौटाता है?

मैंने सोचा क्योंकि आकार (char) = 1, आकार (ए + बी) भी 1 होगा, लेकिन यह 4 हो गया। मुझे यह समझ में नहीं आया, अगर हम जोड़ रहे हैं तो यह 4 क्यों लिखता है दो अक्षर?

+0

आप उम्मीद कर रहे हैं क्या प्रयास करें? आपने 'sizeof' ऑपरेटर के बारे में क्या पढ़ा? –

+0

मुझे उम्मीद है कि यह वापस लौटाएगा। मुझे पता है कि यह बाइट्स में एक प्रकार या चर के आकार को लौटाता है, और वहां फिट बैठने वाले सटीक वर्णों की संख्या। – Nebeski

+0

'ए + बी' एक पूर्णांक मूल्यांकन है। –

उत्तर

12

लगभग सभी अंकगणितीय ऑपरेटर की सी भाषा ऑपरेंड में निहित रूपांतरण सामान्य गणित रूपांतरण या, इस मामले में, पूर्णांक प्रोन्नति कहा जाता है के अधीन हैं। char टाइप करने के लिए int टाइप करने के लिए प्रचारित किया जाता है और वास्तविक प्लेटफ़ॉर्म int (या unsigned int) के डोमेन के भीतर उस प्लेटफ़ॉर्म पर char के गुणों के आधार पर किया जाता है)। तो आपका a + b वास्तव में (int) a + (int) b के रूप में व्याख्या किया गया है। परिणाम int और sizeof(int) आपके प्लेटफ़ॉर्म पर स्पष्ट रूप से 4 है। वह 4 जो आप देखते हैं।

और %dprintfsizeof के परिणाम का उपयोग न करें। sizeof का परिणाम size_t है, जबकि %d को int तर्क की आवश्यकता है। तो, या तो

printf("%zu\n", sizeof(a+b)); 

या कम से कम उचित प्रारूप विनिर्देशक का उपयोग तर्क डाली यदि आप यकीन है कि यह

printf("%d\n", (int) sizeof(a+b)); 
+0

_integral पदोन्नति_ के बारे में कभी नहीं सुना। – chux

+0

@chux - यह पुराना सी 9 0 शब्द है - औपचारिक मानक शब्द पूर्णांक प्रचार है। [यहां] देखें (http://stackoverflow.com/questions/12094412/what-is-the-difference-between-integral-promotion-and-balancing-in-c) और [यहां] (http: // stackoverflow। कॉम/प्रश्न/10660758/अभिन्न पदोन्नति) – Krease

+0

@ क्रिसिस के लिए मैं देखता हूं: -> "इंटीग्रल प्रोन्नति" पुराना सी 9 0 शब्द है, औपचारिक मानक शब्द पूर्णांक प्रचार है। – chux

6

फिट बैठता है यह sizeof(char), तर्क (का परिणाम यानी के रूप में ही नहीं है) को int पर प्रचारित किया गया है, इसलिए sizeof(a + b) वास्तव में sizeof(int) के बराबर है। यदि आप परिणाम को char पर डाल देते हैं तो यह वही होगा जो आप उम्मीद करते हैं। साथ ही, sizeof परिणाम के लिए सही प्रारूप विनिर्देश size_t%zu है और %d नहीं है।

printf("%zu", sizeof((char) (a + b)));