2009-12-29 11 views
7

ठीक है, मैंने सी में विषम मुहावरे और सामान्य प्रथाओं के बारे में कई पोस्ट देखी हैं जो प्रारंभ में सहज नहीं हो सकती हैं। शायद कुछ उदाहरणसी इडियम्स और छोटे ज्ञात तथ्यों

एक सरणी में

तत्वों क्रम में हैं:

#define ELEMENTS(x) (sizeof (x)/sizeof (*(x))) 

Odd array indexing:

a[5] = 5[a] 

Single line if/else/while/for safe #defines

#define FOO(X) do { f(X); g(X); } while (0) 
#define FOO(X) if (1) { f(X); g(X); } else 

विशेषज्ञ करने के लिए मेरा प्रश्न C प्रोग्रामर है बाहर: क्या मुहावरे, प्रथाओं, कोड स्निपिट, या छोटे ज्ञात तथ्यों सी कोड में बहुत कुछ दिखाते हैं लेकिन शायद बहुत सहज नहीं हो सकते हैं लेकिन सी प्रोग्रामिंग में अच्छी अंतर्दृष्टि प्रदान करते हैं?

+6

समुदाय विकी –

+0

होना चाहिए बहुत खराब यह बंद हो गया था, बॉट एक प्रश्न नहीं है ... –

उत्तर

11

0 n-1 से नीचे की गिनती के लिए "तीर ऑपरेटर":

for (int i = n; i --> 0;) ... 

यह बेहद आम नहीं है, लेकिन यह एक दिलचस्प उदाहरण दिया गया है कि कुछ मायनों में एक for की इनिशियलाइज़/परीक्षण/अद्यतन भागों लूप सम्मेलन हैं। यह सामान्य पैटर्न है, लेकिन आप अभी भी वहां कोई मनमाना अभिव्यक्ति डाल सकते हैं।

यह भी एक अच्छा छोटा अनुस्मारक है कि व्याख्यात्मक विश्लेषण कैसे काम करता है।

+0

http://cplusplus.co.il/2009/12/28/the-omnipotent-arrow-operator/ – rmn

+0

बस इस शक्तिशाली ऑपरेटर से कोई भाग नहीं है। – GManNickG

+0

रैखिक खोज के लिए अच्छा है। आखिरकार, पहली जगह जो आपको दिखानी चाहिए वह आखिरी जगह है जिसे आपने कुछ रखा है। –

4

कॉमा ऑपरेटर, जबकि पूरी तरह से अच्छी तरह से प्रलेखित (के आर इत्यादि) बहुत सारे एल्गोरिदमिक कोड में दिखाई देता है और अक्सर कई प्रोग्रामर को आश्चर्य होता है जिन्होंने पहले इसका सामना नहीं किया है। यह अक्सर कुछ पाश निर्माणों को आसान बनाने के लिए किया जाता है:

#define kITERATIONS_MAX 10 
int i=0,j=0,array[kITERATIONS_MAX],outArray[kITERATIONS_MAX],temp=0; 

for (i=0,j=kITERATIONS_MAX-1; i < kITERATIONS_MAX; i++,j--) 
{ 
temp = array[i]*array[j]; 
outArray[i]=temp; 
} 

ऊपर कोड 0 के माध्यम से 9 के साथ 9 के माध्यम से सरणी तत्वों गुणा करेंगे 0 जबकि नेस्टेड छोरों से परहेज।

अल्पविराम ऑपरेटर का उपयोग करते समय, पहले और दूसरे अभिव्यक्तियों का मूल्यांकन किया जाता है। पहली अभिव्यक्ति का परिणाम अनदेखा किया जाता है और दूसरी अभिव्यक्ति का परिणाम वापस कर दिया जाता है।

+0

मैं दो चीजें करते समय कॉमा ऑपरेटर का उपयोग करता हूं, आमतौर पर एक परीक्षण के बाद असाइनमेंट: 'जबकि (सी = getc(), सी! = ईओएफ) ... '। –

+0

@DavidRTribble 'c = getc()' 'c' के बराबर होने का मूल्यांकन करता है, जिसका अर्थ है कि आप बस (अनुमानतः) 'का उपयोग कर सकते हैं ((c = getc())! = ईओएफ) ...' –

+0

@RobbieMckennie, यह सच है, लेकिन मुझे दो ऑपरेशन (असाइनमेंट और तुलना) को पढ़ने के दौरान 'अलग' अभिव्यक्ति के भीतर दो अलग-अलग अभिव्यक्तियों को पढ़ने में आसान लगता है। –

5

चूंकि कोई इसका उल्लेख करेगा, यह भी हो सकता है: Duff's Device। यह सी में काम करने के तरीके के बारे में एक अच्छा उदाहरण है, और समझने से मुझे पहली बार "आह अनुभव" दिया गया।

send(to, from, count) 
register short *to, *from; 
register count; 
{ 
    register n=(count+7)/8; 
    switch(count%8){ 
    case 0: do{ *to = *from++; 
    case 7:  *to = *from++; 
    case 6:  *to = *from++; 
    case 5:  *to = *from++; 
    case 4:  *to = *from++; 
    case 3:  *to = *from++; 
    case 2:  *to = *from++; 
    case 1:  *to = *from++; 
     }while(--n>0); 
    } 
} 

आज, एक register का उपयोग नहीं होता है, और से बचने पुरानी शैली समारोह परिभाषा: यह अपने मूल कोड है।

+0

इसके अलावा, जैसा कि मैं इसे समझता हूं, आप इसे आधुनिक अनुकूलन कंपाइलर पर नहीं करना चाहते हैं --- आप बस इसके रास्ते में आ जाएंगे। – dubiousjim

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