अभिव्यक्ति और बयान की परिभाषा - और यहां तक कि अगर वहाँ एक या अन्य रूप में ऐसी बात है - एक विशेष भाषा और व्याकरण जो उसका वर्णन लिए विशिष्ट है।
ठीक है, चलो चलते हैं:
एक बयान कुछ '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()
}
वाह:
दूसरी ओर, स्काला (और रूबी) इस तरह के प्रवाह नियंत्रण निर्माणों, अभिव्यक्ति के रूप में प्रयोग की जाने वाली है, हालांकि वे भी बयान के रूप में प्रकट कर सकते हैं अनुमति देता है। यह बहुत है - और यह लगभग व्यापक नहीं है। लेकिन, वापस 'परिभाषा' जिसके बारे में के रूप में तो फिर से बताने से किया जा सकता है, जब खाते में ऊपर विभिन्न उदाहरणों लेने:
तो सवाल में निर्माण हो सकता है, जहां एक मूल्य की आवश्यकता है (उदाहरण के लिए दाएं पर। एक असाइनमेंट के हाथ-पक्ष, फ़ंक्शन तर्क के रूप में, किसी अन्य अभिव्यक्ति में इनपुट के रूप में) तो को अभिव्यक्ति के रूप में माना जा सकता है; और इस तरह के एक संदर्भ में जब निश्चित रूप से एक अभिव्यक्ति है। यदि निर्माण किसी ऐसे स्थान पर दिखाई देता है जहां मूल्य प्रतिस्थापन के माध्यम से नहीं पहुंचा जा सकता है तो यह एक कथन (या बल्कि, कार्य कर सकता है) एक कथन है।
हालत के लिए प्रस्तुतियों का एक अन्य वर्ग सी में एक समारोह घोषणाओं या जावा में वर्ग निर्धारण के रूप में घोषणाओं, है, और यकीनन बयान नहीं हैं; चूंकि निम्नलिखित पहले से ही इतने खंडित हैं कि यह एक नोट जितना अधिक हो जाता है।
उत्तर व्यावहारिक से अधिक दार्शनिक है। वक्तव्य में आम तौर पर दुष्प्रभाव होते हैं, जबकि अभिव्यक्ति आमतौर पर प्रकृति में अधिक बीजगणितीय होती है। पूरी तरह कार्यात्मक भाषाओं में, कोई बयान नहीं है। यही कहना है कि उन चीजों को भी जो दुष्प्रभाव निष्पादित करते हैं (उदाहरण के लिए, फ़ाइल में) उन मानों के संदर्भ में व्यक्त किए जाते हैं जो सभी उत्परिवर्तनों का प्रतिनिधित्व करते हैं (आदर्श) विफलताओं सहित। प्रभावशाली भाषाएं मनमानी कोड निष्पादित करने के लिए बयानों का उपयोग करती हैं, जैसे किसी चर को मान निर्दिष्ट करना, या कंसोल पर प्रिंट करना, और अपवाद प्रसार के बावजूद असफलताओं को संभावित रूप से संवाद करना। –
भेद इस बात पर निर्भर करता है कि आप किस भाषा के बारे में बात कर रहे हैं। सी में, 'x = 1' एक अभिव्यक्ति है और' x = 1; 'एक कथन है। एडा में, 'x: = 1' अभिव्यक्ति नहीं है, लेकिन' x: = 1; 'एक कथन है। –