2015-09-02 8 views
7

मुझे पता है कि यह एक डुप्लिकेट हो सकता है, लेकिन मुझे अपने उदाहरणों के लिए पर्याप्त उत्तर नहीं मिला है। आम तौर पर, बयान और अभिव्यक्तियों के बीच क्या अंतर है? यह एक भेद है जिसे मैंने अभी तक पूरी तरह से प्रतिष्ठित नहीं किया है। मुझे पता है कि आमतौर पर एक अभिव्यक्ति माना जाता है जो एक मूल्य देता है, जैसे शाब्दिक, या एक समारोह। आमतौर पर विवरणों को दुभाषिया को आदेश दिया जाता है, जैसे "प्रिंट ऐसे और ऐसे" या "करते हैं ..."। हालांकि, मुझे यह नहीं मिला।अभिव्यक्ति और कथन के बीच क्या अंतर है?

क्या यह कहना समझ में नहीं आता कि प्रिंट एक अभिव्यक्ति है, क्योंकि यह एक इनपुट प्रिंटिंग (आउटपुट में इनपुट) है? साथ ही, लोग आमतौर पर कहते हैं कि x = 1 एक कथन है, लेकिन इसे अभिव्यक्ति नहीं माना जा सकता है जहां असाइनमेंट ऑपरेटर दो इनपुट पर कार्य कर रहा एक फ़ंक्शन है और आउटपुट यह है कि x 1 को संदर्भित करता है? अंत में, यदि प्रवाह नियंत्रण संरचना जैसे कि नहीं हो सका। । । अन्यथा तीन-तर्क समारोह माना जाना चाहिए जिसमें पहले इनपुट के सत्य मूल्य के आधार पर एक अन्य तर्क वापस आते हैं, जिससे यह अभिव्यक्ति हो जाती है?

मैं शायद उलझन में हूं क्योंकि मेरे पास LISP में पृष्ठभूमि है, जहां सबकुछ एक अभिव्यक्ति है। ऐसा लगता है कि मैं इस विचार से दूर शर्मिंदा नहीं हो सकता कि अधिकांश प्रोग्रामिंग संरचनाएं उनके मूल पर अभिव्यक्तियां हैं। इस प्रकार, क्या कोई समझा सकता है कि तथाकथित कथन और अभिव्यक्ति के बीच वास्तव में क्या अंतर है?

+0

उत्तर व्यावहारिक से अधिक दार्शनिक है। वक्तव्य में आम तौर पर दुष्प्रभाव होते हैं, जबकि अभिव्यक्ति आमतौर पर प्रकृति में अधिक बीजगणितीय होती है। पूरी तरह कार्यात्मक भाषाओं में, कोई बयान नहीं है। यही कहना है कि उन चीजों को भी जो दुष्प्रभाव निष्पादित करते हैं (उदाहरण के लिए, फ़ाइल में) उन मानों के संदर्भ में व्यक्त किए जाते हैं जो सभी उत्परिवर्तनों का प्रतिनिधित्व करते हैं (आदर्श) विफलताओं सहित। प्रभावशाली भाषाएं मनमानी कोड निष्पादित करने के लिए बयानों का उपयोग करती हैं, जैसे किसी चर को मान निर्दिष्ट करना, या कंसोल पर प्रिंट करना, और अपवाद प्रसार के बावजूद असफलताओं को संभावित रूप से संवाद करना। –

+0

भेद इस बात पर निर्भर करता है कि आप किस भाषा के बारे में बात कर रहे हैं। सी में, 'x = 1' एक अभिव्यक्ति है और' x = 1; 'एक कथन है। एडा में, 'x: = 1' अभिव्यक्ति नहीं है, लेकिन' x: = 1; 'एक कथन है। –

उत्तर

3

एक अभिव्यक्ति एक मूल्य उत्पन्न करती है, एक बयान कुछ करता है।

उदाहरण के लिए; सी return a+5; में एक कथन है, यह कॉलर को a+5 अभिव्यक्ति से प्राप्त मूल्य प्रदान करने वाला एक फ़ंक्शन से बाहर निकलता है।

चाहे प्रिंट एक अभिव्यक्ति है या कोई बयान भाषा पर निर्भर करता है।

बेसिक में प्रिंट है जो फ़ंक्शन नहीं है-जैसे यह कुछ ऐसा है जो सोम्पेलर द्वारा विशेष मामले के रूप में संभाला जाता है। इसी तरह पास्कल में write और writeln जो विशेष मामले भी हैं, काम नहीं करते हैं, दूसरी तरफ सी ने() और printf() दोनों कार्य किए हैं। और प्रोग्रामर को समान कार्यों को लिखने की अनुमति देता है जो एक ही तरीके से काम करते हैं।

+0

एक अभिव्यक्ति 'कुछ करें' कर सकती है। – user2864740

+0

@ user2864740 शायद साइड इफेक्ट्स के साथ एक अभिव्यक्ति के बीच एक अंतर और बिना किसी के वारंट किया गया है। – JPC

+1

@ जेपीसी मुझे नहीं लगता कि किसी को प्रश्न का उत्तर देने के लिए अभिव्यक्तियों के साइड इफेक्ट्स पर चर्चा करने की आवश्यकता है (हालांकि यह इसे अच्छी तरह से फिट करता है); एक बयान और अभिव्यक्ति के बीच का अंतर एक * व्याकरण उत्पादन नियम * है। – user2864740

7

अभिव्यक्ति और बयान की परिभाषा - और यहां तक ​​कि अगर वहाँ एक या अन्य रूप में ऐसी बात है - एक विशेष भाषा और व्याकरण जो उसका वर्णन लिए विशिष्ट है।

ठीक है, चलो चलते हैं:

  • एक बयान कुछ 'evaluatable कोड' कि एक अभिव्यक्ति संदर्भ में प्रकट नहीं होता है; और

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

{एक बहुत ही ढीला 'परिभाषा' है, लेकिन वहाँ है कोई एक भाषा। जबकि कुछ भाषाएं सख्त प्रभावों के बारे में सख्त हैं और नहीं हो सकती हैं - और बिना किसी परिणाम या साइड इफेक्ट के निष्पादित कोड बेकार है - मुझे विश्वास नहीं है कि मतभेदों के लिए मौलिक है।}

उदाहरण के लिए, चलिए printf सी में देखें। यह एक ऐसा फ़ंक्शन है जो साइड-इफेक्ट and it returns a value पर है; आमतौर पर वापसी मूल्य को नजरअंदाज कर दिया जाता है। इस प्रकार printf दोनों एक बयान

printf("Hello world!"); 

और अभिव्यक्ति के रूप में प्रकट हो सकते हैं

if (8 == printf("Hello %s!", name)) { // .. 

(ए की voidकेवल सी में एक बयान संदर्भ में प्रदर्शित कर सकते हैं एक वापसी प्रकार के साथ समारोह कॉल लेकिन यह लगाया गया है टाइप सिस्टम द्वारा और पार्सर नहीं।)

इसी तरह, इन दो पंक्तियों को जावास्क्रिप्ट x = 1; और x = (y = 2); में लें। x = .. एक बयान है जबकि y = 2 एक अभिव्यक्ति है जो एक मूल्य प्रदान करती है।

इन उदाहरणों हम देखते हैं कि यह व्याकरण उत्पादन कि अगर यह बयान या एक अभिव्यक्ति के रूप में व्यवहार किया जाता है निर्धारित है दोनों में।

विपरीत रूबी में अभिव्यक्ति के रूप में 'शीर्ष स्तर' असाइनमेंट का इलाज कर सकते हैं:

[1].map {|x| x = 2} 

अब चलो एक चोटी एक अजगर (2.x) लेते हैं। - इन बयानों या अभिव्यक्ति कर रहे हैं

print "Look ma, no parenthesis!" 
x = lambda y: print "Whoops!"  # invalid, print not an expression 

और क्या बारे में if निर्माणों पर: इस मामले में print है, जिसके कारण इन काम करते हैं और काम नहीं क्रमशः एक बयान है? फिर, यह विशेष भाषा पर निर्भर करता है। सी और जावा में स्पष्ट रूप से बयान हैं: मूल्य के विकल्प के रूप में उपयोग करने का कोई तरीका नहीं है।

var emotionalResponse = if (color == "green") { 
          log.cheer() 
          new Cheering() 
         } else { 
          new Tears() 
         } 

वाह:

दूसरी ओर, स्काला (और रूबी) इस तरह के प्रवाह नियंत्रण निर्माणों, अभिव्यक्ति के रूप में प्रयोग की जाने वाली है, हालांकि वे भी बयान के रूप में प्रकट कर सकते हैं अनुमति देता है। यह बहुत है - और यह लगभग व्यापक नहीं है। लेकिन, वापस 'परिभाषा' जिसके बारे में के रूप में तो फिर से बताने से किया जा सकता है, जब खाते में ऊपर विभिन्न उदाहरणों लेने:

तो सवाल में निर्माण हो सकता है, जहां एक मूल्य की आवश्यकता है (उदाहरण के लिए दाएं पर। एक असाइनमेंट के हाथ-पक्ष, फ़ंक्शन तर्क के रूप में, किसी अन्य अभिव्यक्ति में इनपुट के रूप में) तो को अभिव्यक्ति के रूप में माना जा सकता है; और इस तरह के एक संदर्भ में जब निश्चित रूप से एक अभिव्यक्ति है। यदि निर्माण किसी ऐसे स्थान पर दिखाई देता है जहां मूल्य प्रतिस्थापन के माध्यम से नहीं पहुंचा जा सकता है तो यह एक कथन (या बल्कि, कार्य कर सकता है) एक कथन है।


हालत के लिए प्रस्तुतियों का एक अन्य वर्ग सी में एक समारोह घोषणाओं या जावा में वर्ग निर्धारण के रूप में घोषणाओं, है, और यकीनन बयान नहीं हैं; चूंकि निम्नलिखित पहले से ही इतने खंडित हैं कि यह एक नोट जितना अधिक हो जाता है।

+0

'printf()' एक कथन नहीं है। * फ़ंक्शन कॉल * कथन है: 'printf() 'केवल वह फ़ंक्शन है जिसे कॉल किया जाता है। – EJP

+0

@EJP "एक समारोह है .. के रूप में दिखाई दे सकता है" - हालांकि मैं अधिक स्पष्ट प्रस्तावों के लिए खुला हूं। – user2864740

+0

@EJP: सी में, 'printf ("हैलो")' एक अभिव्यक्ति है, एक बयान नहीं। 'printf (" हैलो ");' एक बयान है। एक * अभिव्यक्ति कथन * एक विशेष प्रकार का बयान है, जिसमें अर्धविराम के बाद एक (वैकल्पिक) अभिव्यक्ति होती है। (शून्य कारण को कुछ कारणों से अभिव्यक्ति कथन के रूप में माना जाता है।) –

0

उत्तर व्यावहारिक से अधिक दार्शनिक है। वक्तव्य में आम तौर पर दुष्प्रभाव होते हैं, जबकि अभिव्यक्ति आमतौर पर प्रकृति में अधिक बीजगणितीय होती है।

पूरी तरह कार्यात्मक भाषाओं में, कोई बयान नहीं है। यही कहना है कि उन चीजों को भी जो दुष्प्रभाव निष्पादित करते हैं (उदाहरण के लिए, फ़ाइल में) उन मानों के संदर्भ में व्यक्त किए जाते हैं जो सभी उत्परिवर्तनों का प्रतिनिधित्व करते हैं (आदर्श) विफलताओं सहित।

प्रभावशाली भाषाएं मानदंड कोड निष्पादित करने के लिए बयानों का उपयोग करती हैं, जैसे किसी चर को मान निर्दिष्ट करना, या कंसोल पर प्रिंट करना, और अपवाद प्रसार के बावजूद असफलताओं को संभावित रूप से संवाद करना।

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

असफलताओं को मूल्यों के रूप में असफलताओं का पर्दाफाश करने की आवश्यकता नहीं है, और इसलिए हमेशा एक अनजान विधि में मौजूद मनमानी कोड की संभावना हमेशा इस तरह से अनदेखी की जाती है। स्टेटमेंट्स, जैसे कि विध्वंस आमंत्रण या परिवर्तनीय असाइनमेंट (x = y = z()), आमतौर पर मनमानी कोड निष्पादित करते समय अभिव्यक्ति के मोल्ड को फिट कर सकते हैं और विफलताओं को मूल्यों के रूप में संवाद करने में विफल रहते हैं।

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

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