ऑपरेटरों की सहानुभूति क्या है और यह महत्वपूर्ण क्यों है?


87

सहकारिता क्या है (एक ऑपरेटर के लिए) और यह महत्वपूर्ण क्यों है?

अपडेट किया गया: ऑपरेटर संबद्धता


2
यह कैसी सहानुभूति है? संचालक संघवाद?
इके

26
@ नील बटरवर्थ - यह एक उचित प्रश्न की तरह लगता है के लिए एक विशेष रूप से कठोर टिप्पणी है। साइट का पूरा बिंदु परिचयात्मक ग्रंथों में शामिल चीजों सहित सभी प्रोग्रामिंग ज्ञान के लिए एक केंद्रीय भंडार होना है। जैसा कि आप @ जियान लिन की टिप्पणी पर अपनी टिप्पणी का जवाब दे रहे हैं, वह भी आधिकारिक एफएक्यू के पहले प्रश्न के रूप में स्वीकार्य है। अपने प्रतिनिधि स्तर के साथ किसी को बेहतर पता होना चाहिए। यदि आप इससे असहमत हैं, तो कम से कम इसके बारे में सभ्य हों।
रॉब एलेन

1
@ रोब एलन अपने अन्य पोस्ट देखें। इसके अलावा, मैंने यह नहीं कहा कि वह अपने स्वयं के पोस्ट का जवाब नहीं देना चाहिए, केवल यह उपयोगी नहीं था। और मैं आपको एक सौदा करूँगा - मैं आपको अपनी पोस्ट यहाँ कैसे वाक्यांश बताऊँ अगर आप मुझे नहीं बताएंगे कि मेरा वाक्यांश कैसे बनाया जाए।

जवाबों:


105

ऑपरेटरों के लिए, सहकारिता का अर्थ है कि जब एक ही ऑपरेटर एक पंक्ति में दिखाई देता है, तो हम किस ऑपरेटर को लागू करते हैं। निम्नलिखित में, Qऑपरेटर होने दें

a Q b Q c

यदि Qसहयोगी छोड़ दिया जाता है, तो यह मूल्यांकन करता है

(a Q b) Q c

और अगर यह सही सहयोगी है, तो यह मूल्यांकन करता है

a Q (b Q c)

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

4 / 2 / 3    <=>    (4 / 2) / 3    <=> 2 / 3     = 0

यदि यह सही सहयोगी थे, तो यह एक अपरिभाषित अभिव्यक्ति का मूल्यांकन करेगा, क्योंकि आप शून्य से विभाजित होंगे

4 / 2 / 3    <=>    4 / (2 / 3)    <=> 4 / 0     = undefined

क्या आप जानते हैं कि कैसे सहानुभूति को पाया जाए कि क्या यह दिए गए ग्रामर के लिए छोड़ा गया है या सही है?
15:25 बजे user2510115

1
उदाहरण के लिए expr -> expr + term;, साहचर्य छोड़ दिया गया है और expr -> term + exprसही सहयोगी है।
सुबिन सेबेस्टियन

15
आपके उत्तर की पहली पंक्ति में, "जब एक ही ऑपरेटर दिखाई देता है" के बजाय "यह कहना अधिक उपयुक्त होगा" जब एक ही पूर्ववर्ती के ऑपरेटर दिखाई देते हैं "। उदाहरण: एक * बी / सी => जहां * और / एक ही पूर्वता है।
ओ 1

2
@ 1O1 धन्यवाद, लेकिन क्या होता है अगर एक ही मिसाल वाले संचालकों की अलग-अलग संगति होती है? a * b / cमूल्यांकन कैसे होगा यदि *वाम-सहयोगी /होगा लेकिन सही सहयोगी होगा? फिर विरोधाभास है। इसलिए मुझे लगता है कि जब एक से अधिक ऑपरेटरों को कवर करना चाहते हैं, तो "जब एक ही प्रक्रिया और सहानुभूति के साथ ऑपरेटर" कहने की आवश्यकता होती है।
जोहान्स शाउब -

2
@ मर्क मैं नहीं जानता, लेकिन मैं यह नहीं सोच सकता कि यह कैसे काम करना चाहिए। संभवतः एक अतिरिक्त स्टैकओवरफ़्लो प्रश्न के लायक है
जोहान्स शहाब -

13

तीन तरह की सहानुभूति होती है:

गणित में सहयोगी संपत्ति

प्रोग्रामिंग भाषाओं में संचालन का क्रम

सीपीयू कैश में सहयोगीता।

गणित में साहचर्य संपत्ति इसके अलावा (+) जैसे ऑपरेटरों की संपत्ति है। यह गुण आपको किसी स्टेटमेंट के मूल्य को बदले बिना कोष्ठक को पुनर्व्यवस्थित करने की अनुमति देता है, अर्थात:

(a + b) + c = a + (b + c)

प्रोग्रामिंग भाषाओं में, एक ऑपरेटर की सहानुभूति (या शुद्धता) एक संपत्ति है जो यह निर्धारित करती है कि अनुपस्थिति में एक ही वरीयता के ऑपरेटरों को कैसे वर्गीकृत किया जाता है को कोष्ठक है; प्रत्येक ऑपरेटर का मूल्यांकन किस क्रम में किया जाता है। यह प्रोग्रामिंग भाषाओं के बीच अंतर कर सकता है।

सीपीयू कैश में, अनुरूपता प्रदर्शन के अनुकूलन की एक विधि है।


3
एक ऑपरेटर की सहानुभूति (या शुद्धता) एक संपत्ति है जो यह निर्धारित करती है कि एक ही पूर्वता के ऑपरेटरों को कोष्ठक की अनुपस्थिति में कैसे वर्गीकृत किया जाता है - यह वाक्यांश मुझे समझने के लिए एकदम सही था
राफेल Eyng

7

सरल!!

Left Associative means we evaluate our expression from left to right

Right Associative means we evaluate our expression from right to left 

हम जानते हैं *, /, और% में एक ही मिसाल है, लेकिन अनुरूपता के अनुसार, उत्तर बदल सकता है:

उदाहरण के लिए: हमारे पास अभिव्यक्ति है: 4 * 8/2% 5

Left associative:   (4 * 8) / 2 % 5 ==> (32 / 2) % 5 ==> 16 % 5 ==> 1

Right associative:  4 * 8 /(2 % 5) ==>  4 * ( 8 / 2) ==> 4 * 4 ==> 16

2
उत्तर में त्रुटि प्रतीत होती है: का 2 % 5मूल्यांकन करता है 2, नहीं 0
6005

5

यदि आप "ऑपरेटर संघात्मकता" का उल्लेख कर रहे हैं - तो यह है कि कैसे एक भाषा निर्धारित करती है कि एक ही वरीयता के ऑपरेटरों को कोष्ठक की अनुपस्थिति में कैसे वर्गीकृत किया जाता है।

उदाहरण के लिए, C- आधारित भाषाओं में + और - ऑपरेटरों की एक ही पूर्वता है। जब आप एक अभिव्यक्ति लिखते हैं जो उन दोनों (कोष्ठक के बिना) का उपयोग करता है, तो संकलक को यह निर्धारित करना होगा कि उन्हें किस क्रम में मूल्यांकन करना है।

यदि आप 12 - 5 + 3 लिखते हैं, तो संभावित मूल्यांकन में शामिल हैं:

  1. (१२ - ५) + ३ = १०
  2. 12 - (5 + 3) = 4

जिस क्रम में आप अभिव्यक्ति का मूल्यांकन करते हैं, उसके आधार पर आप विभिन्न परिणाम प्राप्त कर सकते हैं। सी-आधारित भाषाओं में, + और - ने सहानुभूति छोड़ दी है, जिसका अर्थ है कि ऊपर की अभिव्यक्ति पहले मामले के रूप में मूल्यांकन करेगी।

सभी भाषा में पूर्वता और सहानुभूति दोनों के लिए दृढ़ता से परिभाषित नियम हैं। आप यहां C # के नियमों के बारे में अधिक जान सकते हैं । ऑपरेटर के सामान्य अवधारणाओं संबद्धता और पूर्वता विकिपीडिया पर अच्छी तरह से शामिल हैं।


यदि वे सभी एक ही ऑपरेंड का उपयोग करते हैं तो आपके उदाहरण स्पष्ट हो जाएंगे।
माइकल कार्मन

क्या होगा अगर एक ही मिसाल वाले दो संचालक बिना परांठे के एक अभिव्यक्ति में दिखाई दें, लेकिन उनमें से एक ने सहानुभूति छोड़ दी थी और दूसरे ने सही किया था? क्या यह सिर्फ उस संचालक की सहानुभूति का उपयोग करेगा, जिसे कभी वह पहले खोजता है?
हेक्टर

ऐसा नहीं हो सकता क्योंकि एक ही मिसाल का मतलब समान संगति है। यदि यह मामला नहीं होता तो वास्तविकता में बहुत अस्तित्व की धमकी देने वाली अस्पष्टता हो सकती है।
अंकुर एस

5

यह उसी वरीयता के ऑपरेटरों के लिए मूल्यांकन का क्रम है। बाएँ या बाएँ आदेश मामलों के लिए सही है। के लिये

3 - 2 - 1

अगर यह सही करने के लिए बाएँ है, तो यह है

(3 - 2) - 1

और 0. अगर यह बाएँ करने के लिए सही है, तो यह है

3 - (2 - 1)

और यह 2. अधिकांश भाषाओं में, हम कहते हैं कि माइनस ऑपरेटर के पास LEIT TO RIGHT सहानुभूति है।

अद्यतन 2020:

इस बारे में स्थिति 3 - 2 - 1तुच्छ लग सकती है, यदि दावा है, "बेशक हम इसे बाएं से दाएं करते हैं"। लेकिन अन्य मामलों में, जैसे कि रूबी में या नोडजेएस में किया गया:

$ irb
2.6.3 :001 > 2 ** 3 ** 2
 => 512 

**ऑपरेटर "की शक्ति के लिए" है। समरूपता दाएं से बाएं है। और यह है

 2 ** (3 ** 2)

जो है 2 ** 9 , अर्थात, 512के बजाय

(2 ** 3) ** 2

जो है 8 ** 2, अर्थात 64


4
यदि आप पहले से ही जवाब जानते थे, तो आपने सवाल क्यों पूछा?
रॉबर्ट हार्वे

6
नए लोगों की मदद करना था। मुझे याद है कि बहुत समय पहले सी सीखना और पता नहीं था कि वास्तव में क्या समानता बाद में थी।
अपराह्न

3
मुझे संदेह है कि C सीखने वाले अधिकांश लोग आपकी "सहायता" के बिना कर सकते हैं।

1
hm, उदाहरण के लिए, क्या सहक्रियाशीलता एक ही ऑपरेटर तक सीमित है, या क्या यह उसी पूर्ववर्ती स्तर पर ऑपरेटरों के लिए है? क्या कई लोग जवाब दे सकते हैं कि पुस्तकों या संदर्भों की जांच के बिना?
२०

13
@ नील बटरवर्थ, इतनी दुश्मनी क्यों? मुझे लगता है कि अपने प्रश्न का उत्तर पोस्ट करना स्वीकार्य है। यह अक्सर पूछे जाने वाले प्रश्न में है, और इसका उल्लेख कई बार पॉडकास्ट में किया गया है।
जे कॉनरोड

3

मुझे लगता है कि आप ऑपरेटर की सहानुभूति का मतलब है ...

यह एक ऑपरेटर को ऑपरेटरों के बंधन का आदेश है। मूल रूप से:

ए - बी + सी

के रूप में मूल्यांकन किया जा सकता है (मान - और + एक ही पूर्वता है):

((a - b) + c) या,
(a - (b + c))

यदि ऑपरेटरों को सहयोगी (बाएं ऑपरेंड को तुरंत बाँध दिया जाता है) छोड़ दिया जाता है, तो इसका मूल्यांकन पहले के रूप में किया जाएगा। यदि वे सही सहयोगी हैं, तो इसका मूल्यांकन दूसरे के रूप में किया जाएगा।


1

यदि आपका मतलब संचालक सहकारिता से है:

यह अभिव्यक्ति के तरीके को परिभाषित करता है। यह एक मानक देता है, इसलिए प्रत्येक अभिव्यक्ति को उसी तरह से पार्स किया जाता है।

यह ज्यादातर उन ऑपरेशनों के लिए महत्वपूर्ण है, जिनमें एक ही मिसाल है, जब साइड इफेक्ट हो सकते हैं।


0

पिछले उदाहरणों में से अधिकांश में स्थिरांक का उपयोग किया गया है। यदि फ़ंक्शन फ़ंक्शन कॉल होने के लिए होता है, तो कॉल करने वाले आदेश को संघ नियमों द्वारा निर्धारित किया जा सकता है, जो इस कंपाइलर पर निश्चित रूप से निर्भर करता है। और अगर उन कार्यों के दुष्प्रभाव हैं ..


0

हम सभी जानते हैं कि पूर्वगामीता महत्वपूर्ण है लेकिन एक अभिव्यक्ति के अर्थ की व्याख्या करने में सहयोगीता है। एक बहुत ही सरल परिचय के लिए ऑपरेटरों की शक्ति का प्रयास करें ।


0

प्रोग्रामिंग भाषा अवधारणाओं में संगणना कम्प्यूटेशन के क्रम में आती है। गणना का क्रम अभिव्यक्ति के अर्थ को निर्धारित करता है। इसके दो मुख्य नियम हैं,

  1. वरीयता नियम
  2. सहयोगीता नियम

पूर्ववर्ती नियम उस क्रम को परिभाषित करते हैं जिसमें विभिन्न प्रकार के "आसन्न" ऑपरेटरों का मूल्यांकन किया जाता है। हर प्रोग्रामिंग लैंग्वेज की अपने ऑपरेटर्स के संबंध में अपनी खुद की ऑपरेटर मिसाल है।

संघवाद पर वापस आते हुए,

यह उसी पूर्वता के साथ आसन्न संचालन के निष्पादन के आदेश को परिभाषित करता है। इसके 3 स्वाद हैं,

बाएं-संघात्यता
सम-समरूपता
गैर-संघातता

यदि एक ऑपरेटर बाएं-साहचर्य है तो यह बाएं से दाएं का मूल्यांकन करता है, यदि यह सही-सहयोगी है तो यह दाएं से बाएं से मूल्यांकन करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.