2012-07-23 13 views
7

मैं इस कोड के आउटपुट के पीछे कारण जानना चाहता हूं। मैं एक जवाब के साथ नहीं आ सकता था।सी प्रीप्रोसेसर: मैक्रो और पहचान मैक्रो स्ट्रिंग करें

#define f(a,b) a##b 
#define g(a) #a 
#define h(a) g(a) 
void main() 
{ 
    printf("%s %s",h(f(1,2)),g(f(1,2))); 
} 

पीएस: आउटपुट 12 f(1,2) है। मैंने सोचा कि यह 12 12 या f(1,2) f(1,2) था।

+3

सिर्फ पूर्वप्रक्रमक काम कर जानने के लिए ... – Dhatri

+3

@cnicutar मुझे लगता है कि वह यह पाया गया: http://cracktheinterviewers.blogspot.com/2012_03_01_archive.html – Dave

+0

यह नहीं लिखा गया था द्वारा me..it एक परीक्षण में पूछा गया था। – Dhatri

उत्तर

4
h(f(1,2)) 

f(1,2)a दिया जाता है। a# या ## ऑपरेटर का विषय नहीं है, इसलिए इसे 12 पर विस्तारित किया गया है। अब आपके पास g(12) है जो "12" तक फैला है।

g(f(1,2)) 

f(1,2)a दिया जाता है। # ऑपरेटर a पर लागू मैक्रो विस्तार को रोकता है, इसलिए परिणाम सचमुच "f(1,2)" है।

+0

ओह ... ठीक है धन्यवाद ... मैंने # ऑपरेटर – Dhatri

+0

@ विंध्य के कार्यकलापों पर ध्यान केंद्रित नहीं किया है यह सब एक खूनी गड़बड़ है। – Potatoswatter

2

बस प्रतिस्थापन करें।

h(f(1, 2)) -> g(12) -> "12" 

g(f(1,2)) -> "f(1, 2)" 

तुम भी here देखना चाहिए।

+0

के लिए दूसरा एक भी जी (एफ (1,2)) जी (12) और 12 सही हो सकता है? – Dhatri

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