2012-03-30 11 views
16

मैं हमेशा उत्सुक रहा हूं, time(time_t *) फ़ंक्शन दोनों time_t क्यों लौटाते हैं, और समय को पॉइंटर में पास करते हैं?समय (time_t *) दोनों रिटर्न क्यों काम करता है और बाय-रेफ सेट करता है?

समय लौटने का उदाहरण:

time_t myTime; 
time(&myTime); 
printf("The time is now %s", ctime(&myTime)); 

मैं मूल रूप से की बजाय स्मृति के लिए लिख वापस लौट कर सोचा एक प्रदर्शन लाभ होगा:

time_t myTime = time(NULL); 
printf("The time is now %s", ctime(&myTime)); 

सूचक के लिए मूल्य स्थापित करने का उदाहरण , लेकिन अगर इसे दोनों करना है, तो क्या यह इसे धीमा नहीं करता है?

उत्तर

16

वहाँ रास्ते में कोई वास्तविक लाभ यह वर्तमान में परिभाषित है ।

मुझे संदेह है कि जब time() फ़ंक्शन को पहली बार परिभाषित किया गया था, तो यह एक प्रकार का उपयोग करता था जिसे किसी फ़ंक्शन से वापस नहीं किया जा सका। बहुत जल्दी सी कार्यान्वयन में long int नहीं था और वे कार्यों से संरचनाओं को वापस करने में सक्षम नहीं थे। 16-बिट इंट्स वाली प्रणाली पर, एक समय का प्रतिनिधित्व करने का एकमात्र तरीका संरचना या सरणी के रूप में होगा; 16 बिट्स सेकेंड सेकेंड एक दिन से भी कम है।

time_t now; 
time(&now); /* sets now.time_high, now.time_low */ 

या शायद:

time() की तो जल्दी कार्यान्वयन इस (अटकलें) की तरह कुछ के लिए इस्तेमाल किया गया हो सकता है

int now[2]; 
time_t(now); /* sets now[0], now[1] */ 

जब बाद में सी कार्यान्वयन अब पूर्णांकों और संरचनाओं वापसी करने की क्षमता जोड़ा मूल्य के अनुसार, time() फ़ंक्शन से time_t मान वापस करने की क्षमता को जोड़ा गया था, लेकिन मौजूदा कार्यक्षमता को तोड़ने से बचने के लिए पुरानी कार्यक्षमता को रखा गया था।

मुझे लगता है कि अगर time() आज परिभाषित किया जा रहा था, इसे और अधिक इस प्रकार दिखाई देगा:

time_t time(void); 

मैं time() समारोह की है कि पुराने कार्यान्वयन पुष्टि करने के लिए नहीं कर पाए हैं इस तरह से काम किया है (Googling "की कोशिश समय "!), लेकिन यह भाषा के इतिहास को समझ में आता है।

यदि आप time() फ़ंक्शन पर एक शून्य सूचक पास करते हैं, तो यह वर्तमान समय को एक चर में संग्रहीत किए बिना लौटाता है; इस प्रदर्शन की सजा में से कुछ से बचा जाता है: `टाइम_टी एक्स = (अब = समय())` + more_time:

time_t now = time(NULL); 
+0

यह सराहनीय लगता है। मैं प्रदर्शन दंड की दूसरी तरफ जाने की उम्मीद कर रहा था। यदि आप एक पूर्ण पास करते हैं, तो इससे बचा जाता है, लेकिन यदि आप इसे एक सूचक के साथ बुलाते हैं और रिटर्न परिणाम को अनदेखा करते हैं, तो उसे अभी भी रिटर्न रजिस्टर में समय देना होगा। कभी-कभी मैं भूल जाता हूं कि सी लगभग दो गुना पुराना है जैसा मैं हूं। :) – wjl

+2

* कभी-कभी मैं भूल जाता हूं कि सी लगभग दो गुना पुराना है। * - मुझे पुराना महसूस करने के लिए धन्यवाद! 8-)} –

7

यह आप घोंसला करने के लिए time() के लिए एक कॉल एक और अभिव्यक्ति के भीतर, बजाय एक अलग बयान में यह करने की अनुमति देता है:

time_t x = time(&now) + more_time; 

जब ऊपर बयान खत्म, now वर्तमान समय को शामिल करना चाहिए, और x शामिल करना चाहिए वर्तमान समय और कुछ मूल्य। क्योंकि यह एक ही char * सूचक है कि अपने गंतव्य के रूप में पारित किया गया है देता है, तो यह रूप में अच्छी तरह से संभव है नेस्टिंग

strcpy इसी मामले में गिर जाता है:

printf("Copied string is %s", strcpy(dst, src)); 
+3

तो 'समय()' कोई तर्क, कि बस के रूप में आसानी से एक काम घोंसले बनाने के किया जा सकता है ले लिया ; ' –

+3

जबकि मैं कीथ से सहमत हूं, यह उत्तर मैंने पहली बार देखा है कि मैंने' टाइम' के अजीब हस्ताक्षर के लिए संभावित सुविधाजनक उपयोग प्रदान किया है ... –

+0

मुझे लगता है कि दोनों मामलों में यह दो लाइनों का उपयोग करना बेहतर होगा पठनीयता के लिए। यह शायद किसी भी तरह से एक ही तरह से संकलित करता है। – wjl

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