2010-10-18 12 views
8

क्यों निम्नलिखित कॉल: "सही" 97 98 मूल्यों मेंprintf int से int सेस्टिंग का बहुत अच्छा कास्टिंग?

printf("%d %d", 'a', 'b'); 

परिणाम? % d इंगित करता है कि फ़ंक्शन को डेटा के 4 बाइट्स को पढ़ना है, और printf प्राप्त तर्कों के प्रकार (प्रारूप स्ट्रिंग के अलावा) को बताने में सक्षम नहीं होना चाहिए, तो मुद्रित संख्या |a||b||junk||junk| क्यों नहीं है?

अग्रिम धन्यवाद।

+0

% d एक हस्ताक्षरित पूर्णांक है, बाइट की संख्या शामिल ... – leppie

+2

@leppie बारे में कुछ नहीं कहना है: हालांकि, यह बाइट्स के कुछ निश्चित संख्या के साथ प्रदान किया जाने वाला है, और 'printf' की एक निश्चित संख्या लेने के लिए है इसके लिए ढेर से बाइट्स, और इन निश्चित संख्याओं को एक जैसा होना चाहिए। –

+4

'' a'' 'टाइप 'int' नहीं' char' है। –

उत्तर

14

इस मामले में, printf द्वारा प्राप्त पैरामीटर int टाइप होंगे।

सबसे पहले, कुछ भी आप (पहले पैरामीटर को छोड़कर) printf के पास से होकर गुजरती है "डिफ़ॉल्ट प्रचार", जिसका अर्थ है (अन्य बातों के अलावा) कि char और short दोनों पारित किया जा रहा से पहले int करने के लिए प्रोत्साहित कर रहे हैं। तो, भले ही आप जो भी पारित कर रहे थे, उसके पास टाइप चार हो, जब तक यह printf तक पहुंच गया, तो इसमें int टाइप होगा। आपके मामले में, आप एक वर्ण शाब्दिक का उपयोग कर रहे हैं, जो पहले से ही int टाइप कर रहा है।

स्कैनफ के साथ भी यही सच है, और अन्य फ़ंक्शन जो विविधता पैरामीटर लेते हैं।

एक पूर्णांक चरित्र निरंतर प्रकार int है:

दूसरा, यहां तक ​​कि डिफ़ॉल्ट पदोन्नति के बिना, सी में चरित्र शाब्दिक पहले से ही वैसे भी प्रकार int (§6.4.4.4/10) है।

इसलिए, इस मामले में मान प्रकार int के साथ शुरू और उन्हें प्रचारित नहीं कर रहे हैं - लेकिन आप char है, की तरह कुछ के साथ शुरू किया, भले ही:

char a = 'a'; 

printf("%d", a); 

... क्या printf प्राप्त करता है int प्रकार का होगा, वैसे भी char टाइप न करें।

+1

डिफ़ॉल्ट प्रचार? वास्तव में? जब से varargs डिफ़ॉल्ट प्रचार करते हैं? क्या यह सिर्फ इतना नहीं है कि चरित्र अक्षर का प्रकार 'int' है? –

+4

हां और नहीं - हां, एक चार शाब्दिक प्रकार 'int' टाइप किया गया है, लेकिन यहां तक ​​कि अगर उसने इसे' char' में असाइन किया है और उसे पास किया है, तो 'printf' को अभी भी' int 'प्राप्त होगा, इसलिए यह बहुत अधिक अप्रासंगिक है। –

+0

राइट अप, जैरी। धन्यवाद। –

4

C में, एक चार शाब्दिक int प्रकार का मान है।

0

यह आपके द्वारा दर्ज किए गए पात्रों के लिए डीईसी ASCII प्रिंट करता है।