2008-11-13 12 views
8

मैं हमेशा सोच रहा था कि क्यों दो सरल भाषाओं की सामग्री को स्वैप करना इतना आसान और बुनियादी ऑपरेशन कई भाषाओं के लिए अंतर्निहित नहीं है।क्यों एक स्वैप/एक्सचेंज ऑपरेटर अनिवार्य या ओओ भाषाओं जैसे सी/सी ++/सी #/जावा में मौजूद नहीं है ...?

यह कंप्यूटर विज्ञान कक्षाओं में सबसे बुनियादी प्रोग्रामिंग अभ्यासों में से एक है; इसका उपयोग कई एल्गोरिदम (जैसे सॉर्टिंग) में किया जाता है; हर अब और फिर किसी को इसकी आवश्यकता होती है और किसी को अस्थायी चर का उपयोग करना चाहिए या टेम्पलेट/जेनेरिक फ़ंक्शन का उपयोग करना चाहिए।

यह कई प्रोसेसर पर भी एक मूल मशीन निर्देश है, ताकि अस्थायी चर के साथ मानक योजना अनुकूलित हो सके।

असाइनमेंट ऑपरेटरों की तरह कई कम स्पष्ट ऑपरेटर बनाए गए हैं (उदा। + =, जो संचयी मशीन निर्देशों को प्रतिबिंबित करने के लिए संभवतः बनाया गया था, उदाहरण के लिए कुल्हाड़ी, बीएक्स जोड़ें), या ?? ऑपरेटर सी # में।

तो, कारण क्या है? या यह वास्तव में मौजूद है, और मैं हमेशा इसे याद किया?

+0

अच्छे प्रश्न। मैंने इसके बारे में भी सोचा है, हालांकि प्रतिक्रियाएं समझ में आती हैं। – pro3carp3

+1

एसडब्ल्यूएपी कथन * क्यूबासिक में मौजूद है *। – dan04

+0

'स्वैप दो चर' मैक्रो से अधिक दिलचस्प कुछ ऐसा होगा जो अल्पविराम ऑपरेटर की तरह व्यवहार करता था, लेकिन जिसका मूल्य पहले ऑपरेंड का था। कल्पना करें कि ऑपरेटर को "=:" के रूप में लिखा गया था (मैं वास्तव में नहीं जानता कि नोटेशन क्या अच्छा होगा)। फिर "x = (y =: y = x)" x और y स्वैप करेगा। अन्य उपयोग होंगे, उदा। "वापसी (वाई =: वाई + = 4)" अवधारणात्मक रूप से बाद में वृद्धि ऑपरेटर के समान होगी, लेकिन एक के बजाय 4 से बढ़ती है। – supercat

उत्तर

11

मेरे अनुभव में, यह है कि आम तौर पर वास्तविक अनुप्रयोगों में की जरूरत है, के अलावा पहले से ही उल्लेख किया तरह एल्गोरिदम से और कभी कभी में नहीं है निम्न स्तर के हार्डवेयर पोकिंग, इसलिए मेरे विचार में यह सामान्य उद्देश्य वाली भाषा में थोड़ा सा विशेष उद्देश्य है।

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

आकलन ऑपरेटर (+ = आदि) समर्थित थे क्योंकि वास्तविक दुनिया के कार्यक्रमों में ये अधिक आम हैं - और इसलिए उनके द्वारा प्रदान की जाने वाली सिंटैसिक चीनी अधिक उपयोगी थी, और अनुकूलन के रूप में - 60 के उत्तरार्ध से सी तिथियां याद रखें/शुरुआती 70 के दशक में, और कंपाइलर अनुकूलन उन्नत नहीं था (और मशीनें कम सक्षम थीं, इसलिए आप लंबे ऑप्टिमाइज़ेशन को वैसे भी पास नहीं करना चाहते थे)।

पॉल

+0

अच्छा जवाब। लेकिन इसमें अधिक एल्गोरिदम हैं जिनका उपयोग किया जाता है: फिशर-यल्स एल्गोरिदम (आधुनिक संस्करण), स्टीनहॉस-जॉनसन-ट्रॉटर एल्गोरिदम, मैट्रिक्स-ट्रांस्पोजिशन। और अधिक विशिष्ट लोगों में, जहां इसे अंतरिक्ष जटिलता को कम करने के लिए तर्क के रूप में उपयोग किया जाता है। मैं मानता हूं कि ये विशेष मामले हैं। –

+1

"ये विशेष मामले हैं" बिल्कुल। –

+0

एक ऑप्टिमाइज़िंग कंपाइलर तब भी देशी स्वैप निर्देशों का उपयोग कर सकता है जब भी यह पैटर्न को स्पॉट करता है, इसलिए उद्धृत विशेष मामलों के लिए इसकी आवश्यकता भी नहीं है। –

0

आप XOR operator कि आदिम प्रकार के लिए एक चर प्रतिस्थापन करता है ...

+0

यदि आपके द्वारा स्वैपिंग की जाने वाली दो चीजें एक ही भंडारण स्थान हैं, तो यह त्रुटि हो सकती है। यह उन्हें शून्य कर देगा। मुझे यह भी बताया गया है कि आधुनिक प्रोसेसर पर, यह अस्थायी चर का उपयोग करने से कम कुशल है। –

3

यह कंप्यूटर विज्ञान के पाठ्यक्रमों में व्यापक रूप से इस्तेमाल उदाहरण है, लेकिन मैं लगभग कभी नहीं अपने आप को वास्तविक कोड में यह आवश्यकता होगी, लगता है - जबकि मैं का उपयोग + = बहुत बार।

हां, क्रमबद्ध करने में यह आसान होगा - लेकिन आपको स्वयं को सॉर्ट करने की आवश्यकता नहीं है, इसलिए स्रोत कोड में वास्तविक उपयोगों की संख्या अभी भी बहुत कम होगी।

+0

दो लालचों को स्वैप करना आम नहीं है, लेकिन यह एक सामान्य रूप से एक लालसा को स्टोर करना और पढ़ना चाहता है। एक अर्थ में, पोस्टफिक्स ++ और - ऑपरेटरों ने ऐसा किया है (वे एक संशोधित मान की एक दुकान करते हैं, लेकिन शेष अभिव्यक्ति के लिए प्रचारित मान प्री-अपडेट मान है)। – supercat

-1

मुझे लगता है कि वे इसे जोड़ने के लिए भूल गए हैं :-) हां, सभी CPUs में इस प्रकार के निर्देश नहीं हैं, तो क्या? हमारे पास अन्य चीजों का समूह है कि अधिकांश CPUs में गणना करने के निर्देश नहीं हैं। अगर यह हमारे पास होता तो यह बहुत आसान/स्पष्ट और तेज (आंतरिक रूप से) होगा !!!

+0

जरूरी नहीं होगा कि कोई भी तेज़ हो - संकलक कॉल को इनलाइन करने के लिए इनलाइन कर सकता है (और मैं कल्पना करता हूं कि कुछ पहले से ही करते हैं) यदि यह वास्तव में महत्वपूर्ण है। –

+0

अंतर्निहित हार्डवेयर के बारे में क्या, यदि उसके पास XCHG या समान निर्देश था, तो अस्थायी चर की आवश्यकता के बिना स्वैप किया जाएगा और यह तेज़ी से निष्पादित होगा। इनलाइनिंग से आंतरिक के लिए और भी कुछ है! – Malkocoglu

+0

... और इनलाइनिंग की तुलना में अनुकूलन के लिए और भी कुछ है। कंपाइलर्स एक स्वैप होने पर पता लगाने में सक्षम होते हैं (यह * * * एक अस्थायी चर की पहचान करने के लिए कठिन है और इसके बजाय XCHG का उपयोग करें)। – Imagist

4

सी ++ स्वैपिंग कर रहा है।

#include <algorithm> 
#include <cassert> 

int 
main() 
{ 
    using std::swap; 
    int a(3), b(5); 
    swap(a, b); 
    assert(a == 5 && b == 3); 
} 

इसके अलावा, आप कस्टम प्रकारों के लिए swap विशेषज्ञ भी कर सकते हैं!

+2

यह सिर्फ एक परिभाषित कार्य है। मेरा मतलब था, यह सीधे अंतर्निहित क्यों नहीं है। –

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

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