printf

2011-01-19 8 views
16

के साथ एक चार इन दोनों कोड एक हीprintf

char ch = 'a'; 
printf("%d", ch); 

यह एक कचरा मूल्य मुद्रित कर रहे हैं मुद्रण?

मैं इस

printf("%d", '\0'); 

क्या यह प्रिंट 0 या कचरा मूल्य के बारे में उलझन में हूँ? क्योंकि जब मैं इस 4.

printf("%d", sizeof('\n')); 

यह प्रिंट क्यों sizeof('\n') 4 बाइट है? सी ++ में एक ही चीज 1 बाइट प्रिंट करती है। ऐसा क्यों है?

तो यहाँ मुख्य प्रश्न

सी भाषा में है printf("%d", '\0') मुद्रित करने के लिए 0

और सी ++ printf("%d", '\0') में कचरा मुद्रित करने के लिए माना जाता माना जाता है?

उत्तर

5

सी char में int को अभिव्यक्तियों में पदोन्नत किया जाता है। यदि आप इसके बारे में सोचते हैं, तो यह बहुत अधिक प्रश्न बताता है।

स्रोत: ब्रायन W.Kernighan और डेनिस M.Ritchie द्वारा सी प्रोग्रामिंग भाषा

एक अगर तुम जानने के लिए सी

इसके अलावा this stack overflow page, जहां लोगों को और अधिक अनुभवी तो मुझे यह कर सकते हैं देखना चाहते हैं अवश्य पढ़ें इसे बेहतर समझाओ तो मैं कभी भी कर सकता हूं।

+0

@nightcracker: पदोन्नत ..? – BlackBear

+0

@ ब्लैकबियर: हां, क्योंकि (अधिकांश प्रणालियों पर) एक char एक बाइट और एक int चार है, इसलिए यह एक पदोन्नति है। – orlp

+0

@ रात्रिभोजक: ओह धन्यवाद। मैंने नोटिस नहीं किया कि% d;) – BlackBear

29

%d एक पूर्णांक प्रिंट करता है: यह आपके चरित्र के एएससीआई प्रतिनिधित्व को मुद्रित करेगा। क्या आप की जरूरत %c है:

printf("%c", ch); 

printf("%d", '\0'); प्रिंट '\0' की ascii प्रतिनिधित्व है, जो 0 (0 से बचने के द्वारा होता है आप ascii मूल्य 0.

printf("%d", sizeof('\n')); प्रिंट उपयोग करने के लिए संकलक बता 4 क्योंकि एक चरित्र शाब्दिक एक int, सी में, और नहीं है एक char

+2

आपने लड़के के प्रश्न को भी नहीं पढ़ा। – orlp

+0

@nightcracker: एचएम? यदि 'printf ("% d ", ch);" "एक कचरा मूल्य प्रिंट करता है", मुझे लगता है कि ऐसा इसलिए है क्योंकि वह अपने एसीआई मूल्य के बजाय 'ए' प्रिंट करना चाहता था ... – peoro

+0

उसने कभी कचरा मूल्य मुद्रित कुछ भी नहीं कहा, उसने पूछा कि क्या यह होगा या नहीं। – orlp

7

यह, चरित्र की ASCII मूल्य मुद्रित करने के लिए के रूप में %d एक पूर्णांक के लिए एस्केप अनुक्रम है माना जाता है। तो मान तर्क ओ के रूप में दिया मुद्रित होने पर एफ printf को पूर्णांक के रूप में लिया जाता है।

char ch = 'a'; 
printf("%d", ch); 

ही printf("%d", '\0');, जहां शून्य चरित्र के रूप में 0 पूर्णांक व्याख्या की है के लिए आयोजित करता है।

अंत में, sizeof('\n') 4 है क्योंकि सी में, वर्णों के लिए यह संकेत इसी ASCII पूर्णांक के लिए है। तो '\ n' एक पूर्णांक के रूप में 10 के समान है।

यह सब बाइट्स को दी गई व्याख्या पर निर्भर करता है।

+0

+1 की मदद करेगा ताकि प्रिंटफ ("% d", ch) आउटपुट (int) 97 और printf ("% d", '\ 0') (int) 0 – BlackBear

+0

मैं कहूंगा कि "तो '\ n' एक int, 32 बिट्स, 4 बाइट्स, और sizeof() रिटर्न 4 है। * \ N 'का मान * 10, दशमलव है। Ascii में NEWLINE।" मूल, एकल वाक्य सच है, लेकिन शायद बहुत terse। –

5

सी में, इस तरह '\n' या 'a' के रूप में चरित्र निरंतर भाव, प्रकार int (इस प्रकार sizeof '\n' == sizeof (int)) है, जबकि C++ वे प्रकार char है।

कथन printf("%d", '\0'); बस 0 प्रिंट करना चाहिए; अभिव्यक्ति '\0' के प्रकार int है, और इसके मूल्य 0.

बयान printf("%d", ch);ch में (ASCII, 'a' == 97 के लिए) मूल्य के लिए पूर्णांक एन्कोडिंग प्रिंट चाहिए।

-2

हां, जब तक आप भाग्यशाली नहीं होते हैं, यह गैरेज को प्रिंट करता है।

बहुत महत्वपूर्ण।

printf/sprintf/fprintf तर्क का प्रकार संबंधित प्रारूप प्रकार char से मेल खाना चाहिए।

यदि प्रकार मेल नहीं खाते और यह संकलित करता है, तो परिणाम बहुत अनिर्धारित होते हैं।

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

यदि आप परिवर्तनीय कार्यों के लिए तर्कों के प्रकारों को रूपांतरित करना चाहते हैं, तो आपको कास्ट (यानी स्पष्ट रूपांतरण) की आपूर्ति करनी चाहिए क्योंकि संकलक यह नहीं समझ सकता कि एक रूपांतरण की आवश्यकता है (जैसा कि यह एक फ़ंक्शन प्रोटोटाइप के साथ हो सकता है टाइप किए गए तर्क के साथ)।

printf("%d\n", (int) ch) 

इस उदाहरण में, printf को बताया जा रहा है कि ढेर पर "int" है। कास्ट यह सुनिश्चित करता है कि जो कुछ भी आकार लौटाता है (आमतौर पर कुछ प्रकार का लंबा पूर्णांक), printf एक int प्राप्त करेगा।

printf("%d", (int) sizeof('\n')) 
+1

-1 लगभग सब कुछ गलत है। Printf के प्रोटोटाइप को मानते हुए, भिन्नता कार्यों के लिए अभिन्न प्रचार के कारण एक char या छोटा से% d पास करने के लिए यह बिल्कुल ठीक है। कास्टिंग सबसे अच्छा मूर्खतापूर्ण है। – Jens

3
#include <stdio.h> 
#include <stdlib.h> 

int func(char a, char b, char c) /* demonstration that char on stack is promoted to int !!! 
            note: this promotion is NOT integer promotion, but promotion during handling of the stack. don't confuse the two */ 
{ 
    const char *p = &a; 
    printf("a=%d\n" 
     "b=%d\n" 
     "c=%d\n", *p, p[-(int)sizeof(int)], p[-(int)sizeof(int) * 2]); // don't do this. might probably work on x86 with gcc (but again: don't do this) 
} 


int main(void) 
{ 
    func(1, 2, 3); 

    //printf with %d treats its argument as int (argument must be int or smaller -> works because of conversion to int when on stack -- see demo above) 
    printf("%d, %d, %d\n", (long long) 1, 2, 3); // don't do this! Argument must be int or smaller type (like char... which is converted to int when on the stack -- see above) 



    // backslash followed by number is a oct VALUE 
    printf("%d\n", '\377');    /* prints -1 -> IF char is signed char: char literal has all bits set and is thus value -1. 
                -> char literal is then integer promoted to int. (this promotion has nothing to do with the stack. don't confuse the two!!!) */ 
             /* prints 255 -> IF char is unsigned char: char literal has all bits set and is thus value 255. 
                -> char literal is then integer promoted to int */ 


    // backslash followed by x is a hex VALUE 
    printf("%d\n", '\xff');    /* prints -1 -> IF char is signed char: char literal has all bits set and is thus value -1. 
                -> char literal is then integer promoted to int */ 
             /* prints 255 -> IF char is unsigned char: char literal has all bits set and is thus value 255. 
                -> char literal is then integer promoted to int */ 


    printf("%d\n", 255);    // prints 255 


    printf("%d\n", (char)255);   // prints -1 -> 255 is cast to char where it is -1 
    printf("%d\n", '\n');    // prints 10 -> Ascii newline has VALUE 10. The char 10 is integer promoted to int 10 
    printf("%d\n", sizeof('\n'));  // prints 4 -> Ascii newline is char, but integer promoted to int. And sizeof(int) is 4 (on many architectures) 
    printf("%d\n", sizeof((char)'\n')); // prints 1 -> Switch off integer promotion via cast! 

    return 0; 
} 
+1

कृपया अपनी लाइनों को 90 वर्णों तक सीमित करें। आपके पाठ का एक आधा छिपा हुआ है। –