2010-11-27 8 views
7

कुछ कंप्यूटर अनुप्रयोग-विज्ञान के कागजात और परीक्षण में, मैं स्वैप() इतना तरह कार्यान्वित देखें:स्वैप() कभी-कभी सरणी पास करके लागू क्यों किया जाता है?

void swap(int x, int y, int *a) 
{ 
    int t = a[x]; 
    a[x] = a[y]; 
    a[y] = t; 
} 

क्यों नहीं बस यह इतना तरह लागू:

void swap(int& x, int& y) 
{ 
    int t = x; 
    x = y; 
    y = t; 
} 

पूर्व करने के लिए विचार करने के लिए है कॉलिंग कोड क्लीनर, पहले दो तर्कों के लिए सरणी में अनुक्रमणित नहीं कर रहा है? मुझे एहसास है कि यह एक बहुत ही महत्वपूर्ण सवाल नहीं है, क्योंकि हमें std :: swap() का उपयोग करना चाहिए, लेकिन मैं अभी भी उत्सुक हूं।

उत्तर

6

सभी प्रोग्रामिंग भाषा संदर्भ द्वारा कॉलिंग का समर्थन नहीं करती हैं। उदाहरण के लिए, swap करने का बाद का तरीका जावा पर लागू नहीं होता है।

छद्म कोड युक्त पुस्तकों में, आमतौर पर एक सम्मेलन होता है कि पारित होने पर सरणी और पॉइंटर्स की प्रतिलिपि नहीं बनाई जाती है और फ़ंक्शन कॉल में बाकी सब कुछ कॉपी किया जाता है। पूर्व तरीके से तर्क पारित होने के तरीके के बारे में कोई विशेष स्पष्टीकरण की आवश्यकता नहीं है।

सफाई के बारे में अपने अंतिम बिंदु के बारे में, यह इतना बहुत अलग नहीं है: पूर्व मामले में, स्वैप करने के लिए अपने कॉल बस होगा: swap(i, j, a); बाद में जबकि, आप swap(a[i], a[j]); करना होगा, अभिव्यक्ति में कुछ कोष्ठक शुरू।

+1

जावा? क्या यह एक प्रोग्रामिंग भाषा है? ;) – ybungalobill

+0

जावा के मामले में, यह केवल कॉल-बाय-रेफरेंस नहीं बल्कि इन्फिक्स पॉइंटर्स समर्थित है जो समर्थित नहीं हैं। अधिकांश (सभी?) कचरा-एकत्रित भाषाएं उन्हें मना करती हैं क्योंकि वे जीसी के लिए हैंडल करने के लिए एक गड़बड़ हैं। ये भाषाएं स्वाभाविक रूप से आपको प्रश्न में पहली स्निपेट की शैली में लिखने के लिए प्रेरित करती हैं। –

+1

@ पास्कल: सी # 'रेफरी पैरामीटर का समर्थन करता है। –

2

आपका दूसरा कोड नमूना सी ++ है, नहीं सी सी ++ संदर्भ पैरामीटर का समर्थन करता है, लेकिन सी केवल पॉइंटर्स के माध्यम से अप्रत्यक्ष रूप से संदर्भ का समर्थन करता है।

मैं मानता हूं कि दूसरा कार्यान्वयन क्लीनर है। इसे सी में काम करने के लिए, प्रत्येक पैरामीटर में & को * पर बदलें और फ़ंक्शन के अंदर प्रत्येक x और y (* के साथ) को प्रतिबिंबित करें।

+0

धन्यवाद, हाँ मुझे पता है कि और एक सी ++ सुविधा है। मैंने प्रश्न के लिए टैग में सी शामिल किया क्योंकि मैंने सोचा था कि यह शुद्ध सी लोगों से अपील करेगा (यदि वे भी मौजूद हैं)। –

+0

@ फास्ट मछली: कृपया अपने दर्शकों को बढ़ाने के इरादे से टैग शामिल न करें। – dmckee

+0

@dmckee, यकीन नहीं है कि मैं आपका अनुसरण करता हूं। मेरे विचार में, सी प्रोग्रामर इस अभ्यास में अंतर्दृष्टि प्रदान करने में सक्षम होंगे, बशर्ते कि मेरे मूल रूप से जिन प्रश्नों को मैं मूल रूप से संदर्भित करता हूं उन्हें सी पर लक्षित किया गया था या सी का उपयोग किया गया था। दर्शकों को बढ़ाना सही दर्शकों तक पहुंचने के उद्देश्य से समझदार है। श्रोताओं को अपने आप के लिए बढ़ाने का कोई प्रयास नहीं था, अगर आप यही बात कर रहे थे। –

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