2010-07-26 15 views
9

कैसे निम्न पंक्ति जीसीसी संकलक द्वारा व्याख्या की है:printf कथन का व्याख्या कैसे किया जाता है?

printf("HELLO"); 

मैं इस जानना चाहता हूँ क्योंकि जब मैं निम्नलिखित कार्यक्रम चला रहा हूँ:

main() 
{ 
    printf(5+"Good Morning"); 
} 

कार्यक्रम मुद्रण है:

Morning 

संकलक छठे चरित्र से प्रिंटिंग क्यों शुरू कर रहा है?

उत्तर

22

यहां बहुत सी चीजें हो रही हैं। जैसा कि अन्य ने कहा है, printf() अभिव्यक्ति 5+"Good Morning" अभिव्यक्ति के बारे में कुछ भी नहीं जानता है। उस अभिव्यक्ति का मूल्य सी भाषा द्वारा निर्धारित किया जाता है।

पहले, a+b, b+a रूप में ही है इसलिए 5+"Good Morning""Good Morning"+5 के समान है।

अब, "Good Morning" (यानी, एक स्ट्रिंग अक्षर) का प्रकार "char" का सरणी है। विशेष रूप से, "Good Morning" एक 13-वर्ण सरणी (12 "नियमित" वर्ण है, उसके बाद 0)। जब अधिकांश अभिव्यक्तियों में उपयोग किया जाता है, तो type of an array in C अपने पहले तत्व के लिए सूचक के लिए "क्षय", और बाइनरी अतिरिक्त एक ऐसा मामला है।इसका मतलब यह है कि "Good Morning"+5 में, "Good Morning" अपने पहले तत्व के लिए एक सूचक के लिए क्षय, जो चरित्र G है।

0 1 2 3 4 5 6 7 8 9 0 1 2 
+---+---+---+---+---+---+---+---+---+---+---+---+---+ 
| G | o | o | d | | M | o | r | n | i | n | g | 0 | 
+---+---+---+---+---+---+---+---+---+---+---+---+---+ 

G प्लस 5 पते का मूल्य एक सूचक है कि जो M है ऊपर G से 5 स्थानों, ओर इशारा करता है:

यहाँ कैसे स्मृति लग रहा है की तरह है। तो, printf() एक पता प्राप्त कर रहा है जो M पर है। printf() प्रिंट करता है कि जब तक यह 0 नहीं मिलता है। इसलिए आप आउटपुट के रूप में Morning देखते हैं।

+5

+1 इसे डंबिंग नहीं करने के लिए +1 (esp। "अधिकांश अभिव्यक्तियों में, सी" decays "में एक सरणी के प्रकार को अपने पहले तत्व के लिए" ला ला ला "के बजाय, एक सरणी एक पॉइंटर, ला ला ला ") – detly

7

है

char *ptr="Good Morning"; 

द्वारा

printf(ptr + 5); 

जो &ptr[5] इस पते अंक के लिए "मॉर्निंग" है पीछा किया लेखन के रूप में ही है,

एक पता ptr + n * sizeof के सूचक के परिणाम के लिए एक पूर्णांक n जोड़ा जा रहा है (प्रकार)

4

क्योंकि "Good Morning" स्ट्रिंग (वास्तव में यह की पहली बाइट के लिए) के लिए एक सूचक और कहा कि सूचक के लिए 5 जोड़ने है 5 वें चरित्र के लिए एक सूचक उत्पन्न करता है। सी तारों को निरस्त कर दिया जाता है, इसलिए किसी भी तरह से, printf तब तक चलता है जब तक कि अंत में नल का सामना न हो जाए।

25

यह सी पॉइंटर-अंकगणित का एक आर्टिफैक्ट है; printf सिर्फ एक लाल हेरिंग है।

एक स्ट्रिंग के प्रकार के शाब्दिक (जैसे "Good morning के रूप में ") const char * है आपका कोड के बराबर है:।।

const char *p = "Good morning"; 
p = p + 5; 
printf(p); 

एक सूचक जोड़ा जा रहा है और एक पूर्णांक अनुक्रम में 5 वीं तत्व के लिए सूचक का उत्पादन

+0

डाउनवॉटर: टिप्पणी करने की देखभाल? –

3

यह 5 बाइट्स द्वारा इनपुट सूचक अग्रिम और इसलिए शब्द "अच्छा" को छोड़ देता है।

यह सी में pointer arithmetic

है

चलें स्ट्रिंग के आधार सूचक मान "गुड मॉर्निंग" पी है, और 5 + पी = पी + 5 और यह पत्र के लिए अंक एम

इसलिए printf के लिए इनपुट पत्र से सूचक है एम

संबंधित मुद्दे