2012-01-30 18 views
9

मैं एक पटकथा भाषा लिखने की प्रक्रिया में हूँ और मैं (बहुत अच्छी तरह से मानकीकृत) कॉपी करने के लिए C order of operations.सी आधारित भाषाओं में दाएं से बाएं और बाएं से दाएं सहयोगीता की विधियां क्या हैं?

एक बात है कि मैं के रूप में एक औपचारिक अवधारणा हालांकि संबद्धता है पर अच्छी पकड़ नहीं था चाहते हैं। कुछ ऑपरेटर समूह बाएं से दाएं और दूसरों को दाएं से बाएं क्यों हैं?

क्या कोई मुझे कुछ उदाहरण दे सकता है कि नियम सभी बाएं से दाएं या उनके विपरीत के विपरीत कोड की रेखा कैसे अलग दिख सकती है? या क्यों सहयोगीता यह तरीका है, क्योंकि ऐसा लगता है कि यह सिर्फ मनमाना विकल्प है, लेकिन मुझे लगता है कि उनके पास इसका कारण था।

इसके अलावा, बस नोट करने के लिए, मुझे पता है, मैं तो बस किसी भी उदाहरण हैं, जहां बाएँ-से-दाएँ (या इसके विपरीत) नहीं सोच सकते हैं क्या संबद्धता साधन है अन्य विकल्प

+0

यह इतना शानदार सवाल है! यह भी देखें [क्यों-करता-द-असाइनमेंट-ऑपरेटर-असाइन-टू-द-बाएं हाथ की तरफ] (http://programmers.stackexchange.com/questions/98406/why-does-the-assignment-operator- असाइन-टू-द-बाएं हाथ की तरफ) – nawfal

उत्तर

13

अधिकांश भाग के लिए, प्रत्येक ऑपरेटर में सहयोगीता होती है जो उस ऑपरेटर के लिए सबसे अधिक समझदारी बनाती है।

सभी गैर-असाइनमेंट बाइनरी ऑपरेटरों के पास बाएं से दाएं सहयोगीता है। यह स्पष्ट कारण के लिए उपयोगी है कि अंग्रेजी को बाएं से दाएं पढ़ा जाता है और इस प्रकार x + y + z का मूल्यांकन यह पढ़ा जाता है कि यह कैसे पढ़ा जाता है। इसके अलावा, अंकगणितीय ऑपरेटरों के लिए, अर्थशास्त्र हम गणित में ऑपरेटरों के उपयोग से अपेक्षा करते हैं।

असाइनमेंट ऑपरेटरों के पास दाएं से बाएं सहयोगीता है। बाएं से दाएं असाइनमेंट में विचित्र और अप्रत्याशित अर्थशास्त्र होगा। उदाहरण के लिए, x = y = z का परिणाम x होगा जिसमें y और y का मूल मूल्य z का मूल मान है। यह अपेक्षा की जाती है कि अभिव्यक्ति पूर्ण होने के बाद सभी तीन चर के समान मूल्य होंगे।

उपसर्ग एकल ऑपरेटरों, दाएँ-से-बाएँ संबद्धता, जो समझ में आता है क्योंकि संकार्य के सबसे करीब ऑपरेटरों पहले मूल्यांकन किया जाता है ताकि ~!x में, !x पहले मूल्यांकन किया जाता है, तो ~ परिणाम के लिए लागू किया जाता है।यह वास्तव में होगा, वास्तव में अजीब उपसर्ग ऑपरेटर बाएं से दाएं सहयोगीता के साथ लागू थे: कहने के लिए कि ~!x का अर्थ है ~x का मूल्यांकन करें और फिर परिणाम के लिए ! लागू करें परिणाम के बारे में हम कैसे सोचते हैं (या, कम से कम , अभिव्यक्तियों के बारे में ज्यादातर लोग क्या सोचते हैं ...)।

+1

सी में, असाइनमेंट ऑपरेटर की बाएं से दाएं सहयोगीता 'x = y = z' एक त्रुटि करेगी (उसी कारण से' (x = y) = z' एक त्रुटि है)। – caf

+0

@caf: सच है, लेकिन अगर कोई ऑपरेटर की सहयोगीता को बदलने पर विचार कर रहा है, तो कोई भी ऑपरेटर अभिव्यक्ति की मान श्रेणी को बदलने पर विचार कर सकता है। –

0

roundoff संचित तुलना में बेहतर है आमतौर पर जवाब है।

हालांकि, >> और < < 2123 काम नहीं करते हैं या नहीं।

6

उदाहरण:

5 - 4 - 3 
(5 - 4) - 3 = -2 // left association is correct 
5 - (4 - 3) = 4 // right is incorrect 

a == b == c // What does this equal? 
      // It is common to have == be non-associative because of this. 

x = y = z 
x = (y = z) // right association is correct, sets x and y 
(x = y) = z // left is incorrect, does not set y 

अधिकांश ऑपरेटरों गणित से उनके संबद्धता प्राप्त करती हैं। बिटवाई को अंकगणितीय ऑपरेटरों के रूप में देखा जा सकता है और इस प्रकार सहयोगीता छोड़ दी गई है।

एकल सही साहचर्य है, क्योंकि यह उस तरह से समूहों:

~!-x = ~(!(-(x))) 

अन्य तरीके से, जब तक पोस्टफ़िक्स खास मतलब नहीं होता।

+1

मुझे गैर-सहयोगीता पसंद नहीं है। मेरे दिमाग में, 'ए == बी == सी' का मतलब होना चाहिए' (ए == बी) == सी' ('ए == बी' से 'सी' के बूलियन परिणाम की तुलना करें) या विशेष रूप से कैस के रूप में पाइथन 'बी बी' = बी में (ए == बी ') और& (बी' == सी) '। –

2

मुश्किल ऑपरेटर एक्सपोनेंटिएशन है (उदाहरण के लिए: ** पायथन में,^आर, हैकसेल में)। अधिकांश भाषाएं, पार्सर्स, आदि 3 ** 3 ** 33 ** (3 ** 3) के रूप में देखें। मुझे व्यक्तिगत रूप से लगता है कि यह सही व्याख्या है, लेकिन हाल ही में देखा गया है कि ऑक्टेट और मैटलैब दोनों इसे (3 ** 3) ** 3 के रूप में गणना करते हैं।

यह सी में जारी नहीं है क्योंकि इसमें एक्सपोनिएशन ऑपरेटर नहीं है। इसके बजाय आप pow फ़ंक्शन पर कॉल करते हैं और स्पष्ट रूप से pow(3,pow(3,3)) या pow(pow(3,3),3) बताते हैं।

+2

यह कोबोल में भी सही सहयोगी है, और फोरट्रान में: http://www.fortran.com/F77_std/rjcnf0001-sh-6.html। गणितीय रूप से यह सही व्याख्या है। – EJP

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