अभिव्यक्ति बनाम कथन


431

मैं c # के संबंध में पूछ रहा हूं, लेकिन मैं इसे अन्य सभी भाषाओं में समान मानता हूं।

क्या किसी के पास अभिव्यक्ति और बयानों की अच्छी परिभाषा है और अंतर क्या हैं?


4
मुझे वह जवाब मिल गया है जिसे आपने अस्पष्ट माना है। एक अभिव्यक्ति भी कुछ करती है - यह एक मूल्य का मूल्यांकन करती है। मैंने एक गैर-अस्पष्ट उत्तर प्रदान किया।
शेल्बी मूर III

4
@ शेहेल्बोइमोरहैथ - गैर-अस्पष्ट और गलत भी। स्वीकृत उत्तर को अनौपचारिक तरीके से लिखा गया है, लेकिन यह शब्द समझने में आसान बनाता है - और सबसे महत्वपूर्ण बात, इसका अर्थ यह है कि यह सटीक है।
जस्टिन मॉर्गन

@JustinMorgan अफसोस की बात है कि ज्यादातर समकालीन भाषा के लिए स्वीकृत उत्तर में परिभाषाएँ भी स्पष्ट रूप से गलत हैं ("एक मूल्य का मूल्यांकन" / "कोड की एक पंक्ति") C- जैसे वाले शामिल हैं: अभिव्यक्ति का उपयोग बिना मूल्यांकन किए गए संदर्भों में किया जा सकता है और बयानों में कुछ भी नहीं है। लाइनों के साथ करने के लिए। यहां तक ​​कि कुछ स्पष्टीकरण भी हैं, संक्षिप्त उत्तर भ्रामक और भ्रामक है।
फ्रैंकएचबी

जवाबों:


520

अभिव्यक्ति: कुछ जो एक मूल्य का मूल्यांकन करता है। उदाहरण: 1 + 2 / x
कथन: कोड की एक पंक्ति जो कुछ करती है। उदाहरण: GOTO 100

आरंभिक सामान्य-प्रयोजन की प्रोग्रामिंग भाषाओं में, FORTRAN की तरह, भेद स्पष्ट था। फोरट्रान में, एक कथन निष्पादन की एक इकाई थी, एक चीज जो आपने की थी। एकमात्र कारण इसे "लाइन" नहीं कहा गया था क्योंकि कभी-कभी यह कई लाइनों को फैलाता था। अपने आप ही एक अभिव्यक्ति कुछ भी नहीं कर सकती थी ... आपको इसे एक चर पर निर्दिष्ट करना था।

1 + 2 / X

FORTRAN में एक त्रुटि है, क्योंकि यह कुछ भी नहीं करता है। आपको उस अभिव्यक्ति के साथ कुछ करना था:

X = 1 + 2 / X

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

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

1 + 2 / x;

पूरी तरह से कानूनी बयान है, हालांकि बिल्कुल कुछ भी नहीं होगा। इसी तरह, सी में, एक अभिव्यक्ति के साइड-इफेक्ट्स हो सकते हैं - यह कुछ बदल सकता है।

1 + 2 / callfunc(12);

क्योंकि callfuncबस कुछ उपयोगी हो सकता है।

एक बार जब आप किसी भी अभिव्यक्ति को बयान करने की अनुमति देते हैं, तो आप अभिव्यक्ति के अंदर असाइनमेंट ऑपरेटर (=) को भी अनुमति दे सकते हैं। इसीलिए C आपको चीजों को करने देता है

callfunc(x = 2);

यह एक्सप्रेशन x = 2 का मूल्यांकन करता है (2 से x के मान को असाइन करता है) और फिर फ़ंक्शन को (2) पास करता है callfunc

अभिव्यक्तियों और कथनों का यह धुंधलापन सभी C- व्युत्पन्न (C, C ++, C #, और जावा) में होता है, जिसमें अभी भी कुछ कथन (जैसे while) हैं, लेकिन जो लगभग किसी भी अभिव्यक्ति को कथन के रूप में उपयोग करने की अनुमति देते हैं (C # केवल असाइनमेंट में, कॉल, वेतन वृद्धि, और गिरावट के बयानों के रूप में इस्तेमाल किया जा सकता है; स्कॉट विस्निस्की का जवाब देखें )।

दो "सिंटेक्टिक कैटेगरीज" (जो कि स्टेटमेंट और एक्सप्रेशन के प्रकार के लिए तकनीकी नाम है) के प्रयास को दोहरा सकते हैं। उदाहरण के लिए, C में सशर्त के दो रूप हैं, कथन रूप

if (E) S1; else S2;

और अभिव्यक्ति रूप

E ? E1 : E2

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

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


9
अगर मैं आपको यहाँ गलत व्याख्या नहीं कर रहा हूँ, तो आप दावा करते हैं कि "(सेटफ (तीसरा फू) 'हंस)" एक अभिव्यक्ति है, न कि एक बयान, दोनों क्योंकि यह लिस्प है, जो "बयान नहीं है," और क्योंकि लिस्प C की तुलना में एक दशक से अधिक पुराना है, जो "अभिव्यक्तियों और कथनों के बीच] लाइनों को धुंधला करने वाली सबसे लोकप्रिय भाषा थी।" मुझे उस का विवरण समझा सकता है?
cjs

2
@ कर्ट सैम्पसन, क्या आपने उससे अलग सवाल पूछा है?
केली एस। फ्रेंच

5
अगर मैं गलत नहीं हूँ, callfunc(x = 2);गुजरता है xकरने के लिए callfunc, नहीं 2। अगर xतैरता है, callfunc(float)तो बुलाया जाएगा, नहीं callfunc(int)। और C ++ में, यदि आप पास x=yजाते हैं func, और funcएक संदर्भ लेते हैं और इसे बदलते हैं, तो यह बदल जाता है x, नहीं y
गैब्रियल

ऊपर के उत्तर में, यह लिखा है कि "हास्केल, ... सभी भाषाएं हैं जिनमें वाक्यविन्यास कथन नहीं हैं - वे केवल अभिव्यक्ति हैं"। मुझे उत्सुकता है कि whereहैसेल में क्लॉज को एक अभिव्यक्ति क्यों माना जाता है और एक बयान नहीं। learnyouahaskell.com/syntax-in-functions#where
skgbanga

@ एस्बंगा मुझे विश्वास whereहै कि वास्तव में फ़ंक्शन घोषणा का एक हिस्सा है, न कि अभिव्यक्ति या कथन।
अकांगका

22
  • एक अभिव्यक्ति कुछ भी है जो एक मूल्य देता है: 2 + 2
  • एक बयान कार्यक्रम निष्पादन के बुनियादी "ब्लॉक" में से एक है।

ध्यान दें कि C में, "=" वास्तव में एक ऑपरेटर है, जो दो चीजें करता है:

  • दाहिने हाथ के उप-मूल्य का मान लौटाता है।
  • बाएं हाथ की तरफ चर में दाहिने हाथ के उपप्रकार के मूल्य को कॉपी करता है।

यहाँ ANSI C व्याकरण से एक अर्क है। आप देख सकते हैं कि C में कई भिन्न प्रकार के कथन नहीं हैं ... एक कार्यक्रम में अधिकांश कथन अभिव्यक्ति कथन हैं, अर्थात अंत में अर्धविराम के साथ एक अभिव्यक्ति।

statement
    : labeled_statement
    | compound_statement
    | expression_statement
    | selection_statement
    | iteration_statement
    | jump_statement
    ;

expression_statement
    : ';'
    | expression ';'
    ;

http://www.lysator.liu.se/c/ANSI-C-grammar-y.html


2
कथन क्या है, इस पर गलत तर्क। एक घोषणा कार्यक्रम भी निष्पादित कर सकता है, लेकिन एक घोषित कार्यक्रम में कोई वक्तव्य नहीं है। एक बयान है और "साइड-इफेक्ट्स" करता है , यानी अत्यावश्यक है। सीएफ मेरा जवाब है
शेल्बी मूर III

15

एक अभिव्यक्ति एक ऐसी चीज है जो एक मूल्य लौटाती है, जबकि एक बयान नहीं करता है।

उदाहरण के लिए:

1 + 2 * 4 * foo.bar()     //Expression
foo.voidFunc(1);          //Statement

दोनों के बीच बड़ा सौदा यह है कि आप भावों को एक साथ जोड़ सकते हैं, जबकि कथन जंजीर नहीं हो सकते।


6
निश्चित बयान जंजीर हो सकते हैं। {stmt1; stmt2; stmt3;} एक चेन है, और यह एक (कंपाउंड) स्टेटमेंट भी है।
ह्यूग एलेन

5
foo.voidFunc(1);एक शून्य मान के साथ एक अभिव्यक्ति है। whileऔर ifबयान हैं।
tzot 13

मैं बयानों की गैर-जंजीरों के बारे में उत्सुक हूं। कुछ ऐसा होगा "अगर (x> 1) वापसी?" एक साथ दो बयानों का पीछा करने के लिए माना जाता है?
साइमन टेवेसी

1
@SimonTewsi मेरा मानना ​​है returnकि इसे एक सबस्टेशन माना जाता है।
रस्ताजेडी

@SimonTewsi यह विवरण यहां दिए गए कथन के ब्लॉक के अंदर निहित है, इसलिए यह इस कथन का हिस्सा है, इसके साथ जंजीर नहीं है। संकलक हमें यहां ब्रेसिज़ को छोड़ने की अनुमति देता है, क्योंकि यह एक एकल पंक्ति ब्लॉक है।
user2597608

9

आप इसे विकिपीडिया पर पा सकते हैं , लेकिन अभिव्यक्तियों का मूल्यांकन कुछ मूल्य के लिए किया जाता है, जबकि बयानों का कोई मूल्यांकन मूल्य नहीं है।

इस प्रकार, अभिव्यक्तियों को बयानों में इस्तेमाल किया जा सकता है, लेकिन आसपास के अन्य तरीके से नहीं।

ध्यान दें कि कुछ भाषाएं (जैसे लिस्प, और मेरा मानना ​​है कि रूबी, और कई अन्य) कथन बनाम अभिव्यक्ति को अलग नहीं करते हैं ... ऐसी भाषाओं में, सब कुछ एक अभिव्यक्ति है और अन्य अभिव्यक्तियों के साथ जंजीर हो सकती है।


8

अभिव्यक्ति बनाम कथनों की रचनाशीलता (श्रृंखलाबद्धता) में महत्वपूर्ण अंतर की व्याख्या के लिए, मेरा पसंदीदा संदर्भ जॉन बैकस का ट्यूरिंग अवार्ड पेपर है, क्या प्रोग्रामिंग को वॉन न्यूमैन शैली से मुक्त किया जा सकता है?

इम्पीरेटिव भाषाएं (फोरट्रान, सी, जावा, ...) संरचित कार्यक्रमों के लिए कथनों पर जोर देती हैं, और एक तरह के विचार के बाद अभिव्यक्ति होती हैं। कार्यात्मक भाषाएं भावों पर जोर देती हैं। विशुद्ध रूप से कार्यात्मक भाषाओं में बयानों की तुलना में ऐसी शक्तिशाली अभिव्यक्तियाँ हैं जिन्हें पूरी तरह से समाप्त किया जा सकता है।


5

एक मूल्य प्राप्त करने के लिए अभिव्यक्तियों का मूल्यांकन किया जा सकता है, जबकि कथन एक मान नहीं देते हैं (वे प्रकार शून्य हैं )।

फ़ंक्शन कॉल अभिव्यक्तियों को भी निश्चित रूप से स्टेटमेंट माना जा सकता है, लेकिन जब तक कि निष्पादन वातावरण में एक विशेष अंतर्निहित वैरिएबल नहीं होता है, तो लौटाया गया मान रखने के लिए, कोई तरीका नहीं है।

कथन-उन्मुख भाषाओं के लिए सभी प्रक्रियाओं को कथनों की एक सूची की आवश्यकता होती है। अभिव्यक्ति-उन्मुख भाषाएं, जो संभवतः सभी कार्यात्मक भाषाएं हैं, अभिव्यक्तियों की सूची है, या एलआईएसपी के थेए मामले में, एक लंबी एस-अभिव्यक्ति जो अभिव्यक्तियों की सूची का प्रतिनिधित्व करती है।

यद्यपि दोनों प्रकारों की रचना की जा सकती है, लेकिन अधिकांश भावों की रचना मनमाने ढंग से की जा सकती है जब तक कि प्रकार मेल खाते हैं। प्रत्येक प्रकार के कथन का अन्य कथनों की रचना का अपना तरीका है, यदि वे ऐसा कर सकते हैं। फॉरचेट और यदि बयानों के लिए या तो एक ही क़ानून की आवश्यकता होती है या यह कि सभी अधीनस्थ कथन एक स्टेटमेंट ब्लॉक में जाते हैं, एक के बाद एक, जब तक कि सबस्टेशन अपने स्वयं के सबस्टेशन की अनुमति नहीं देते।

कथन में ऐसे भाव भी शामिल हो सकते हैं, जहाँ अभिव्यक्ति में वास्तव में कोई कथन शामिल नहीं है। एक अपवाद, हालांकि, एक लैम्ब्डा अभिव्यक्ति होगा, जो एक फ़ंक्शन का प्रतिनिधित्व करता है, और इसलिए कुछ भी फ़ंक्शन शामिल कर सकता है जब तक कि भाषा केवल सीमित लैम्ब्डा के लिए अनुमति नहीं देती है, जैसे कि पायथन का एकल-एक्सप्रेशन लैम्ब्डा।

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


एक स्टेटमेंट का प्रकार नीचे का प्रकार है। Voidनीचे प्रकार नहीं है। मेरा जवाब देखिए ।
शेल्बी मूर तृतीय 19

1
नहीं है अशक्त प्रकार तल प्रकार (की एकल मान null)? यूनिट प्रकार (लेकिन इसके एकल मूल्य के साथ दुर्गम) की voidतरह अधिक नहीं होगा ?
मार्क सिडेड

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

1
तीन साल पहले मैंने जो कहा था, उसके बारे में मुझे नहीं पता कि क्या मैं अभी भी एक शून्य प्रकार या किसी भी प्रकार के बयानों के बारे में सोचता हूं । बयान-आधारित भाषाओं में, जिनसे मैं परिचित हूं, केवल मूल्य और कुछ भी जो मूल्य को स्टोर या रिटर्न करते हैं (जैसे, भाव, चर, सदस्य और कार्य) प्रकार हो सकते हैं। मैं आमतौर पर नीचे के प्रकार को खाली सेट (कोई मान नहीं) के रूप में सोचता हूं और इसलिए ऐसा कुछ भी नहीं है जो ontologically मौजूद नहीं है। एक nullमूल्य वास्तव में एक छद्मसूत्र है जो यह दर्शाता है कि एक संदर्भ का मतलब है कि कुछ मौजूद नहीं है।
मार्क सिडैड

1
मार्क I ने आपकी प्रतिक्रिया की तर्कसंगतता की सराहना की। आपने मूल रूप से मेरे मुंह से शब्द निकाले हैं और मुझे आशा है कि यह स्पष्ट था कि मैंने आपको स्वीकार किया है कि आप इकाई बिंदु को बढ़ाने के लिए सही थे। मुझे लगता है कि हम सहमत हैं। मैं इसका उल्लेख करने की जहमत नहीं उठा रहा था, लेकिन ऐसा लगता है कि यहां कुछ लोग सोचते हैं कि मैं नकारात्मक हो रहा हूं। मैं सिर्फ तथ्यात्मक होने की कोशिश कर रहा हूं।
शेल्बी मूर III

4

बस: एक अभिव्यक्ति एक मूल्य का मूल्यांकन करता है, एक बयान नहीं करता है।


तो एक बयान क्या करता है? कुछ भी तो नहीं?
शेल्बी मूर III

1
यह कुछ कर सकता है, लेकिन यह किसी भी चीज का मूल्यांकन नहीं करता है। यानी, आप इसके परिणाम को एक चर में नहीं दे सकते, जबकि आप एक अभिव्यक्ति के साथ कर सकते हैं।
मैथ्यू Schinckel

और मेरे कथन का दुष्परिणाम होना चाहिए, क्योंकि मेरे भारी मत वाले उत्तर वाले राज्यों में। एक बयान में संभवतः अन्य उपयोगिता क्या हो सकती है? यहां तक ​​कि अगर NO-OP को एक व्याकरण माना जाता है (यह व्याकरण में केवल "कथन" है, लेकिन शब्दार्थ परत पर नहीं क्योंकि इसे पार्स करने के बाद मिटा दिया जाता है और शब्दार्थ क्या है जिसकी हम यहां चर्चा कर रहे हैं), यह नहीं समझाएगा एक बयान की सामान्य उपयोगिता बिल्ली है।
शेल्बी मूर तृतीय

1
@ShelbyMooreIII स्टेटमेंट में कुछ भी करने या साइड इफेक्ट की जरूरत नहीं है। जैसे, {}एक कथन है। शब्द को डराने वाले उद्धरणों में रखने से वह परिवर्तित नहीं होता है। कथन शब्दार्थ के साथ वाक्य रचना हैं। "शब्दार्थ परत" जैसी कोई चीज नहीं है - आप निष्पादन के लिए संदर्भित करते हैं । आप कहते हैं कि आप सटीक होने की कोशिश कर रहे हैं, लेकिन आप उस पर विफल रहे हैं। "डाउन-वोटर्स की अज्ञानता" के बारे में आपकी शिकायत शुद्ध विज्ञापन समरूपता है; आपको डाउनवोटर्स की मानसिक स्थिति के बारे में कोई जानकारी नहीं है।
जिम बाल्टर

हाँ, बौद्धिक रूप से बेईमान को छोड़कर हर कोई गलत है। {}सी # भाषा युक्ति में एक कथन के रूप में परिभाषित किया गया है।
जिम बैटर

4

अभिव्यक्ति आधारित भाषाओं के बारे में कुछ बातें:


सबसे महत्वपूर्ण: सब कुछ एक मूल्य देता है


कोड ब्लॉक और अभिव्यक्तियों को परिसीमित करने के लिए घुंघराले कोष्ठक और ब्रेसिज़ के बीच कोई अंतर नहीं है, क्योंकि सब कुछ एक अभिव्यक्ति है। हालांकि यह लेक्सिकल स्कूपिंग को नहीं रोकता है: एक स्थानीय चर को उस अभिव्यक्ति के लिए परिभाषित किया जा सकता है जिसमें इसकी परिभाषा निहित है और उदाहरण के लिए उसके भीतर निहित सभी कथन।


अभिव्यक्ति आधारित भाषा में, सब कुछ एक मूल्य देता है। यह पहली बार में थोड़ा अजीब हो सकता है - क्या (FOR i = 1 TO 10 DO (print i))वापसी है?

कुछ सरल उदाहरण:

  • (1) रिटर्न 1
  • (1 + 1) रिटर्न 2
  • (1 == 1) रिटर्न TRUE
  • (1 == 2) रिटर्न FALSE
  • (IF 1 == 1 THEN 10 ELSE 5) रिटर्न 10
  • (IF 1 == 2 THEN 10 ELSE 5) रिटर्न 5

कुछ और अधिक जटिल उदाहरण:

  • कुछ चीजें, जैसे कुछ फ़ंक्शन कॉल, वास्तव में वापस करने के लिए एक सार्थक मूल्य नहीं है (चीजें जो केवल साइड इफेक्ट का उत्पादन करती हैं?)। बुलाना OpenADoor(), FlushTheToilet()याTwiddleYourThumbs() किसी प्रकार की सांसारिक वैल्यू वापस करना, जैसे कि OK, Done, या Success।
  • जब एक बड़ी अभिव्यक्ति के भीतर कई अनलिंक किए गए अभिव्यक्तियों का मूल्यांकन किया जाता है, तो बड़ी अभिव्यक्ति में अंतिम चीज का मूल्यांकन बड़ी अभिव्यक्ति का मूल्य बन जाता है। का उदाहरण लेने के लिए (FOR i = 1 TO 10 DO (print i)), लूप का मान "10" है, यह (print i)अभिव्यक्ति को 10 बार मूल्यांकन करने का कारण बनता है , प्रत्येक बार जब मैं एक स्ट्रिंग के रूप में वापस लौटता हूं। रिटर्न के माध्यम से अंतिम समय 10, हमारा अंतिम उत्तर

यह अक्सर अभिव्यक्ति आधारित भाषा से सबसे बाहर निकलने के लिए मानसिकता में थोड़ा बदलाव की आवश्यकता होती है, क्योंकि इस तथ्य के बाद कि सब कुछ एक अभिव्यक्ति है, बहुत सी चीजों को 'इनलाइन' करना संभव बनाता है

एक त्वरित उदाहरण के रूप में:

 FOR i = 1 to (IF MyString == "Hello, World!" THEN 10 ELSE 5) DO
 (
    LotsOfCode
 )

गैर-अभिव्यक्ति-आधारित के लिए पूरी तरह से वैध प्रतिस्थापन है

IF MyString == "Hello, World!" THEN TempVar = 10 ELSE TempVar = 5 
FOR i = 1 TO TempVar DO
(    
    LotsOfCode  
)

कुछ मामलों में, अभिव्यक्ति-आधारित कोड परमिट वाला लेआउट मुझे बहुत अधिक स्वाभाविक लगता है

बेशक, इससे पागलपन हो सकता है। MaxScript नामक एक अभिव्यक्ति-आधारित स्क्रिप्टिंग भाषा में एक शौक परियोजना के हिस्से के रूप में, मैं इस राक्षस लाइन के साथ आने में कामयाब रहा

IF FindSectionStart "rigidifiers" != 0 THEN FOR i = 1 TO (local rigidifier_array = (FOR i = (local NodeStart = FindsectionStart "rigidifiers" + 1) TO (FindSectionEnd(NodeStart) - 1) collect full_array[i])).count DO
(
    LotsOfCode
)

2

एक कथन एक अभिव्यक्ति का एक विशेष मामला है, एक voidप्रकार के साथ । अलग-अलग तरह से बयानों का इलाज करने की भाषाओं की प्रवृत्ति अक्सर समस्याओं का कारण बनती है, और यह बेहतर होगा कि वे ठीक से सामान्यीकृत हों।

उदाहरण के लिए, C # में हमारे पास Func<T1, T2, T3, TResult>जेनेरिक डेलीगेट्स का बहुत उपयोगी ओवरलोड सेट है। लेकिन हमारे पास इसके अनुरूप भी हैAction<T1, T2, T3> साथ ही सेट , और इस दुर्भाग्यपूर्ण द्विभाजन से निपटने के लिए सामान्य प्रयोजन के उच्च-क्रम प्रोग्रामिंग को लगातार दोहराया जाना चाहिए।

तुच्छ उदाहरण - एक फ़ंक्शन जो यह जांचता है कि किसी फ़ंक्शन को कॉल करने से पहले एक संदर्भ शून्य है या नहीं:

TResult IfNotNull<TValue, TResult>(TValue value, Func<TValue, TResult> func)
                  where TValue : class
{
    return (value == null) ? default(TValue) : func(value);
}

क्या संकलक TResultहोने की संभावना से निपट सकता है void? हाँ। बस इतना करना है कि वापसी एक अभिव्यक्ति के बाद होती है जो कि प्रकार की होती है void। का परिणाम default(void)प्रकार का होगा void, और इसमें पारित होने वाले फंक को फॉर्म Func<TValue, void>(जो इसके बराबर होगा Action<TValue>) का होना चाहिए ।

कई अन्य जवाबों का अर्थ है कि आप अभिव्यक्ति की तरह बयानों को चेन नहीं कर सकते, लेकिन मुझे यकीन नहीं है कि यह विचार कहां से आता है। हम यह सोच सकते हैं कि ;बाइनरी इन्फिक्स ऑपरेटर के रूप में बयानों के बाद प्रकट होता है, प्रकार के दो अभिव्यक्ति लेने voidऔर उन्हें एकल प्रकार की अभिव्यक्ति में संयोजित करता है void


एक बयान अभिव्यक्ति का एक विशेष मामला नहीं है। कुछ भाषाओं में (यानी अधिकांश सी उत्तराधिकारी), यह वास्तव में दूसरा तरीका है।
अकांगका

2

कथन -> निर्देश क्रमिक रूप से पालन करने के लिए
-> मूल्यांकन जो एक मान लौटाता है

स्टेटमेंट मूल रूप से एक एल्गोरिथम में दिए गए कदमों या निर्देशों की तरह होते हैं, एक स्टेटमेंट के निष्पादन का परिणाम इंस्ट्रक्शन पॉइंटर (तथाकथित असेंबलर में) की प्राप्ति है।

अभिव्यक्तियाँ पहली नज़र में आदेश और क्रियान्वयन नहीं करती हैं, उनका उद्देश्य मूल्य का मूल्यांकन और वापस करना है। अनिवार्य प्रोग्रामिंग भाषाओं में एक अभिव्यक्ति के मूल्यांकन का एक आदेश होता है, लेकिन यह केवल अनिवार्य मॉडल के कारण होता है, लेकिन यह उनका सार नहीं है।

कथन के उदाहरण:

for
goto
return
if

(उन सभी को एक और लाइन के निष्पादन की लाइन (स्टेटमेंट) का अग्रिम मतलब है)

अभिव्यक्तियों का उदाहरण:

2+2

(यह निष्पादन का विचार नहीं है, लेकिन मूल्यांकन का)


दुष्प्रभावों के बारे में क्या?
ऑस्टिन हेनले

@AustinHenley उसके लिए कोई आवश्यकता नहीं है। वास्तव में, एक अभिव्यक्ति निश्चित रूप से दुष्प्रभाव हो सकती है।
अकांगका

1

कथन ,

एक बयान एक प्रक्रियात्मक इमारत-ब्लॉक है जिसमें से सभी C # प्रोग्राम का निर्माण किया जाता है। एक बयान एक स्थानीय चर या निरंतर की घोषणा कर सकता है, एक विधि को बुला सकता है, एक वस्तु बना सकता है, या एक चर, संपत्ति या क्षेत्र के लिए एक मूल्य प्रदान कर सकता है।

घुंघराले ब्रेसिज़ से घिरे बयानों की एक श्रृंखला कोड का एक ब्लॉक बनाती है। एक विधि निकाय कोड ब्लॉक का एक उदाहरण है।

bool IsPositive(int number)
{
    if (number > 0)
    {
        return true;
    }
    else
    {
        return false;
    }
}

C # में कथन अक्सर अभिव्यक्त होते हैं। C # में एक अभिव्यक्ति कोड का एक टुकड़ा है जिसमें शाब्दिक मूल्य, एक साधारण नाम या एक ऑपरेटर और उसके ऑपरेंड होते हैं।

अभिव्यक्ति ,

एक अभिव्यक्ति कोड का एक टुकड़ा है जिसका मूल्यांकन एक मूल्य, वस्तु, विधि या नाम स्थान पर किया जा सकता है। दो सरल प्रकार के भाव शाब्दिक और सरल नाम हैं। एक शाब्दिक एक निरंतर मूल्य है जिसका कोई नाम नहीं है।

int i = 5;
string s = "Hello World";

मैं और एस दोनों स्थानीय चर की पहचान करने वाले सरल नाम हैं। जब उन चर का उपयोग अभिव्यक्ति में किया जाता है, तो चर का मान पुनः प्राप्त होता है और अभिव्यक्ति के लिए उपयोग किया जाता है।


मैं नहीं बल्कि if(number >= 0) return true; else return false;और भी बेहतर लिखूँगा bool? IsPositive(int number) { if(number > 0) return true; else if(number < 0) return false; else return null;}:)
Mahdi तहसीलदार

1

मैं statementशब्द के औपचारिक तर्क अर्थ में अर्थ को प्राथमिकता देता हूं । यह वह है जो गणना में एक या एक से अधिक चर की स्थिति को बदल देता है, जिससे उनके मूल्य (ओं) के बारे में सही या गलत कथन को सक्षम किया जा सकता है।

मुझे लगता है कि नई शब्दावली या शब्दों को पेश किए जाने पर सामान्य रूप से कंप्यूटिंग की दुनिया और विज्ञान में हमेशा भ्रम की स्थिति रहेगी, मौजूदा शब्द 'पुनर्खरीद' हैं या उपयोगकर्ता मौजूदा, स्थापित या 'उचित' शब्दावली से अनभिज्ञ हैं, जिसका वे वर्णन कर रहे हैं


1

मैं यहाँ किसी भी उत्तर से वास्तव में संतुष्ट नहीं हूँ। मैंने सी ++ (आईएसओ 2008) के व्याकरण को देखा । हालाँकि हो सकता है कि डिडक्टिक्स और प्रोग्रामिंग के लिए उत्तर दोनों तत्वों को अलग करने के लिए पर्याप्त हो (वास्तविकता हालांकि अधिक जटिल लगती है)।

एक बयान में शून्य या अधिक अभिव्यक्ति शामिल हैं, लेकिन अन्य भाषा अवधारणाएं भी हो सकती हैं। यह व्याकरण के लिए विस्तारित बैकस नौर रूप है (कथन के लिए अंश):

statement:
        labeled-statement
        expression-statement <-- can be zero or more expressions
        compound-statement
        selection-statement
        iteration-statement
        jump-statement
        declaration-statement
        try-block

हम उन अन्य अवधारणाओं को देख सकते हैं जिन्हें C ++ में कथन माना जाता है।

  • अभिव्यक्ति-कथन s स्वयं-व्याख्या है (एक कथन में शून्य या अधिक अभिव्यक्ति हो सकती है, व्याकरण को ध्यान से पढ़ें, यह बहुत मुश्किल है)
  • caseउदाहरण के लिए एक लेबल-स्टेटमेंट है
  • चयन-कथन हैं if if/else,case
  • यात्रा बयान रों हैं while, do...while,for (...)
  • कूद-बयान रों हैं break, continue, return(अभिव्यक्ति लौट सकते हैं),goto
  • घोषणा-वक्तव्य घोषणाओं का समुच्चय है
  • try-block स्टेटमेंट का प्रतिनिधित्व करने वाला try/catchब्लॉक है
  • और व्याकरण में कुछ और कमी हो सकती है

यह एक अंश है जो भावों को दर्शाता है:

expression:
        assignment-expression
        expression "," assignment-expression
assignment-expression:
        conditional-expression
        logical-or-expression assignment-operator initializer-clause
        throw-expression
  • अभिव्यक्ति अक्सर असाइनमेंट होते हैं या होते हैं
  • सशर्त अभिव्यक्ति (ध्वनियों को गुमराह) ऑपरेटरों के उपयोग को संदर्भित करता है ( +, -, *, /, &, |, &&, ||, ...)
  • फेंक-अभिव्यक्ति - उह? throwखंड एक अभिव्यक्ति भी है

0

कथन व्याकरणिक रूप से पूर्ण वाक्य हैं। भाव नहीं हैं। उदाहरण के लिए

x = 5

"x 5 हो जाता है" के रूप में पढ़ता है यह पूरा वाकया है। कोड

(x + 5)/9.0

पढ़ता है, "x प्लस 5 सभी 9.0 से विभाजित।" यह पूर्ण वाक्य नहीं है। बयान

while k < 10: 
    print k
    k += 1

एक पूर्ण वाक्य है। ध्यान दें कि लूप हैडर नहीं है; "जबकि के <10," एक अधीनस्थ खंड है।


whileएक अभिव्यक्ति है, जैसे स्काला। आप टाइपिंग के साथ व्याकरण का सामना कर रहे हैं। मेरा जवाब देखिए ।
शेल्बी मूर III

यहाँ स्कैला में लूप है: tutorialspoint.com/scala/scala_ORE_loop.htm लूप अपनी विधेय के साथ है और कोई भी शरीर व्याकरणिक रूप से पूर्ण वाक्य नहीं है। यह पूर्ण अभिव्यक्ति नहीं है। आपको एक अभिव्यक्ति के रूप में इसे पूरा करने के लिए शरीर की आवश्यकता है।
ncmathsadist

एक whileशरीर के साथ अभी भी स्काला में एक अभिव्यक्ति है। यह एक बयान भी हो सकता है अगर यह दुष्प्रभाव पैदा करता है, जो कि मेरे भारी डाउनवॉट जवाब की अनुमति देता है (एक अभिव्यक्ति भी एक बयान हो सकती है)। मेरा उत्तर एकमात्र सही है। उन सभी पाठकों को क्षमा करें जो समझ नहीं सकते हैं।
शेल्बी मूर III

व्याकरणिक रूप से पूर्ण होने का क्या मतलब है? सी में, (x + 5)/9.0निश्चित रूप से एक बयान के रूप में अकेले खड़े हो सकते हैं। साथ ही, यदि व्याकरणिक रूप से पूर्ण होने पर, आपका मतलब एक वैध कार्यक्रम है, तो C केवल एक कार्यक्रम के रूप में बयानों को अकेले खड़े होने की अनुमति नहीं देता है।
अकांगका

व्याकरणिक रूप से पूर्ण: एक पूर्ण वाक्य बनता है।
ncmathsadist

0

यहाँ एक सबसे आसान जवाब है जो मुझे मिला।

मूल रूप से एंडर्स कासेगोर द्वारा उत्तर दिया गया

एक बयान कोड की एक पूरी लाइन है जो कुछ कार्रवाई करता है, जबकि एक अभिव्यक्ति कोड का कोई भी अनुभाग है जो एक मूल्य का मूल्यांकन करता है।

अभिव्यक्तियों को "क्षैतिज" रूप से संचालकों का उपयोग करके बड़े अभिव्यक्तियों में जोड़ा जा सकता है, जबकि बयानों को केवल एक के बाद एक या ब्लॉक निर्माणों के साथ लिखकर "लंबवत" जोड़ा जा सकता है।

प्रत्येक अभिव्यक्ति को एक कथन के रूप में इस्तेमाल किया जा सकता है (जिसका प्रभाव अभिव्यक्ति का मूल्यांकन करना और परिणामी मूल्य की उपेक्षा करना है), लेकिन अधिकांश कथनों को अभिव्यक्ति के रूप में उपयोग नहीं किया जा सकता है।

http://www.quora.com/Python-programming-language-1/Whats-the-difference-between-a-statement-and-an-expression-in-Python


0

इन अवधारणाओं का वास्तविक आधार है:

अभिव्यक्तियाँ : एक वाक्यात्मक श्रेणी जिसका उदाहरण एक मूल्य के लिए मूल्यांकन किया जा सकता है।

कथन : एक वाक्यात्मक श्रेणी जिसका उदाहरण अभिव्यक्ति के मूल्यांकन और मूल्यांकन के परिणामस्वरूप मूल्य (यदि कोई हो) उपलब्ध नहीं है के साथ शामिल हो सकता है।

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

  • अभिव्यक्तियाँ अनवैलिड ऑपरेंड हो सकती हैं। मान कभी उनसे उत्पन्न नहीं होते।
    • गैर-सख्त मूल्यांकन में Subexpressions निश्चित रूप से unevaluated किया जा सकता है।
      • अधिकांश सी-लाइक भाषाओं में तथाकथित शॉर्ट-सर्किट मूल्यांकन नियम हैं, जो कुछ उप-निक्षेपण मूल्यांकन को छोड़ देते हैं, जो साइड इफेक्ट के बावजूद अंतिम परिणाम नहीं बदलते हैं।
    • C और कुछ C- जैसी भाषाओं में अविकसित ऑपरैंड की धारणा है जो भाषा विनिर्देश में भी मानक रूप से परिभाषित हो सकती है। इस तरह के निर्माण का उपयोग निश्चित रूप से मूल्यांकन से बचने के लिए किया जाता है, इसलिए प्रोग्राम ट्रांसलेशन के बाद व्यवहार को बदले बिना संदर्भ जानकारी (उदाहरण के प्रकार या संरेखण आवश्यकताओं) को स्थिर रूप से प्रतिष्ठित किया जा सकता है।
      • उदाहरण के लिए, sizeofऑपरेटर के संचालन के रूप में प्रयुक्त एक अभिव्यक्ति का मूल्यांकन कभी नहीं किया जाता है।
  • बयानों का लाइन निर्माण से कोई लेना-देना नहीं है। वे भाषा विशिष्टताओं के आधार पर अभिव्यक्तियों से अधिक कुछ कर सकते हैं।
    • आधुनिक फोरट्रान, पुराने फोरट्रान के प्रत्यक्ष वंशज के रूप में, निष्पादन योग्य कथन की अवधारणाएं हैं और कोई भी अप्राप्य कथन नहीं है
    • इसी तरह, सी ++ एक अनुवाद इकाई के शीर्ष-स्तरीय उपश्रेणी के रूप में घोषणाओं को परिभाषित करता है। C ++ में एक घोषणा एक बयान है। (यह सी में सच नहीं है।) फ़ॉर्टान के निष्पादन योग्य बयानों की तरह अभिव्यक्ति-कथन भी हैं ।
    • अभिव्यक्तियों के साथ तुलना के हित में, केवल "निष्पादन योग्य" कथन मायने रखता है। लेकिन आप इस तथ्य को नजरअंदाज नहीं कर सकते कि इस तरह की अनिवार्य भाषाओं में अनुवाद इकाइयों के निर्माण के लिए पहले से ही बयानों का सामान्यीकरण किया जाता है। इसलिए, जैसा कि आप देख सकते हैं, श्रेणी की परिभाषाएं बहुत भिन्न होती हैं। इन भाषाओं के बीच केवल (शायद) आम संपत्ति संरक्षित है, बयानों की व्याख्या शाब्दिक क्रम (ज्यादातर उपयोगकर्ताओं के लिए, बाएं से दाएं और ऊपर से नीचे) के रूप में की जाने की उम्मीद है।

(बीटीडब्लू, मैं सी के बारे में सामग्री से संबंधित उस उत्तर को [उद्धरण वांछित] जोड़ना चाहता हूं क्योंकि मुझे याद नहीं आ रहा है कि क्या डीएमआर के पास ऐसी राय है। ऐसा नहीं लगता है, अन्यथा सी के डिजाइन में कार्यक्षमता दोहराव को संरक्षित करने के लिए कोई कारण नहीं होना चाहिए। : विशेष रूप से, अल्पविराम ऑपरेटर बनाम बयान।)

(निम्नलिखित तर्क मूल प्रश्न का सीधा जवाब नहीं है, लेकिन मुझे लगता है कि पहले से ही यहां बताए गए कुछ को स्पष्ट करना आवश्यक है।)

फिर भी, यह संदिग्ध है कि हमें सामान्य प्रयोजन की प्रोग्रामिंग भाषाओं में "बयानों" की एक विशिष्ट श्रेणी की आवश्यकता है:

  • विवरणों में सामान्य डिजाइनों में अभिव्यक्तियों पर अधिक अर्थ क्षमता होने की गारंटी नहीं है।
    • कई भाषाओं ने स्वच्छ, स्वच्छ और सुसंगत समग्र डिजाइन प्राप्त करने के लिए पहले ही बयानों की धारणा को सफलतापूर्वक छोड़ दिया है।
      • ऐसी भाषाओं में, अभिव्यक्तियां सब कुछ कर सकती हैं पुरानी शैली के बयान कर सकते हैं: अभिव्यक्तियों के मूल्यांकन के समय अप्रयुक्त परिणामों को छोड़ दें, या तो परिणामों को स्पष्ट रूप से अनिर्दिष्ट (जैसे आर एन आरएस योजना में) छोड़ दें, या एक विशेष मूल्य (के रूप में) एक इकाई प्रकार का मूल्य) सामान्य अभिव्यक्ति के मूल्यांकन से भिन्न नहीं होता है।
      • अभिव्यक्तियों के मूल्यांकन के शाब्दिक आदेश नियमों को स्पष्ट अनुक्रम नियंत्रण ऑपरेटर (जैसे beginयोजना में) या मोनडिक संरचनाओं के सिंटैक्टिक चीनी द्वारा प्रतिस्थापित किया जा सकता है ।
      • अन्य प्रकार के "स्टेटमेंट्स" के लेक्सिकल ऑर्डर नियमों को सिंटैक्टिक एक्सटेंशन (उदाहरण के लिए, हाइजेनिक मैक्रोज़ का उपयोग करके) के समान व्युत्पन्न कार्यक्षमता प्राप्त करने के लिए किया जा सकता है। (और यह वास्तव में अधिक कर सकते हैं ।)
    • इसके विपरीत, बयानों में ऐसे पारंपरिक नियम नहीं हो सकते हैं, क्योंकि वे मूल्यांकन पर नहीं लिखते हैं: "सबस्टेशन मूल्यांकन" की ऐसी कोई आम धारणा नहीं है। (यदि कोई हो, तो भी मुझे संदेह है कि अभिव्यक्ति के मूल्यांकन के अस्तित्व के नियमों से कॉपी और पेस्ट के अलावा भी बहुत कुछ हो सकता है।)
      • आमतौर पर, बयानों को संरक्षित करने वाली भाषाओं में अभिकलन व्यक्त करने के लिए अभिव्यक्ति भी होगी, और उस उपश्रेणी के लिए अभिव्यक्ति मूल्यांकन के लिए संरक्षित किए गए कथनों का एक शीर्ष-स्तरीय उपश्रेणी है। उदाहरण के लिए, C ++ में उपश्रेणी के रूप में तथाकथित अभिव्यक्ति-कथन है , और ऐसे संदर्भ में पूर्ण-अभिव्यक्ति मूल्यांकन के सामान्य मामलों को निर्दिष्ट करने के लिए त्याग-मूल्य अभिव्यक्ति मूल्यांकन नियमों का उपयोग करता है। C # जैसी कुछ भाषाएं उपयोग के मामलों को आसान बनाने के लिए संदर्भों को परिष्कृत करने का विकल्प चुनती हैं, लेकिन यह विनिर्देशन को और अधिक बढ़ा देता है।
  • प्रोग्रामिंग भाषाओं के उपयोगकर्ताओं के लिए, कथनों का महत्व उन्हें और अधिक भ्रमित कर सकता है।
    • भाषाओं में अभिव्यक्तियों और कथनों के नियमों को अलग करने के लिए भाषा सीखने के लिए अधिक प्रयास की आवश्यकता होती है।
    • भोली लेक्सिकल ऑर्डर व्याख्या अधिक महत्वपूर्ण धारणा को छिपाती है: अभिव्यक्ति मूल्यांकन। (यह शायद सभी पर सबसे अधिक समस्याग्रस्त है।)
      • यहां तक ​​कि बयानों में पूर्ण अभिव्यक्तियों के मूल्यांकन शाब्दिक आदेश के साथ बाधा हैं, उप-विभाजन (आवश्यक रूप से) नहीं हैं। उपयोगकर्ताओं को अंततः बयानों के लिए युग्मित किसी भी नियम के अलावा इसे सीखना चाहिए। (विचार करें कि नौसिखिया बनाने का तरीका ++i + ++iसी में अर्थहीन है।)
      • जावा और सी # जैसी कुछ भाषाएं मूल्यांकन नियमों की अज्ञानता के अनुमेय होने के लिए उप विषयों के मूल्यांकन के आदेश को बाधित करती हैं। यह और भी अधिक समस्याग्रस्त हो सकता है।
        • यह उन उपयोगकर्ताओं के लिए अधिक उपयोगी है जिन्होंने पहले ही अभिव्यक्ति मूल्यांकन का विचार जान लिया है। यह उपयोगकर्ता समुदाय को भाषा डिजाइन के धुंधले मानसिक मॉडल का पालन करने के लिए भी प्रोत्साहित करता है।
        • यह भाषा के विनिर्देश को और भी अधिक बढ़ाता है।
        • अधिक जटिल प्राइमेटिव पेश किए जाने से पहले मूल्यांकन पर नॉनडेटर्मिनिज़्म की अभिव्यंजना को गायब करना अनुकूलन के लिए हानिकारक है।
      • C ++ जैसी कुछ भाषाएं (विशेष रूप से, C ++ 17) मूल्यांकन नियमों के अधिक सूक्ष्म संदर्भों को निर्दिष्ट करती हैं, ऊपर की समस्याओं के एक समझौते के रूप में।
        • यह भाषा विनिर्देश को बहुत बढ़ा देता है।
        • यह औसत उपयोगकर्ताओं के लिए सादगी के खिलाफ पूरी तरह से जाता है ...

तो बयान क्यों? वैसे भी, इतिहास पहले से ही एक गड़बड़ है। ऐसा लगता है कि अधिकांश भाषा डिजाइनर अपनी पसंद का ध्यान नहीं रखते हैं।

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

गंभीरता से, प्रकारों के आधार पर तर्क कई मामलों में उतना बुरा नहीं है, लेकिन विशेष रूप से इस विशेष में रचनात्मक नहीं है। यहां तक ​​कि विशेषज्ञ चीजों को पेंच कर सकते हैं।

उदाहरण के लिए, कोई व्यक्ति अच्छी तरह से टाइप करने वाली प्रकृति पर जोर देता है, जो कि सीमांत निरंतरता के पारंपरिक उपचार के खिलाफ केंद्रीय तर्क है । हालांकि निष्कर्ष कुछ हद तक उचित है और रचित कार्यों के बारे में जानकारी ठीक है ( लेकिन अभी भी बहुत सारगर्भित है ), यह तर्क ध्वनि नहीं है क्योंकि यह पूरी तरह से "साइड चैनल" के दृष्टिकोण को अनदेखा करता है जैसे _Noreturn any_of_returnable_types(सी 11 में) सांकेतिक शब्दों में बदलना Falsumऔर कड़ाई से बोलते हुए, अप्रत्याशित राज्य के साथ एक सार मशीन "दुर्घटनाग्रस्त कंप्यूटर" के समान नहीं है।


0

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

विकिपीडिया शब्द कथन को इसी तरह परिभाषित करता है

कंप्यूटर प्रोग्रामिंग में, एक स्टेटमेंट एक अनिवार्य प्रोग्रामिंग लैंग्वेज की एक सिंटैक्टिक यूनिट होती है जो कुछ कार्रवाई को अंजाम देती है। ऐसी भाषा में लिखा गया कार्यक्रम एक या अधिक कथनों के अनुक्रम द्वारा बनता है

बाद वाले बयान पर गौर करें। (हालांकि इस मामले में "एक कार्यक्रम" तकनीकी रूप से गलत है क्योंकि सी और जावा दोनों एक कार्यक्रम को अस्वीकार करते हैं जिसमें बयानों का कुछ भी नहीं होता है।)

विकिपीडिया शब्द अभिव्यक्ति को परिभाषित करता है

एक प्रोग्रामिंग भाषा में एक अभिव्यक्ति एक वाक्यात्मक इकाई है जिसका मूल्यांकन इसके मूल्य को निर्धारित करने के लिए किया जा सकता है

यह, हालांकि, गलत है, क्योंकि कोटलिन में, throw new Exception("")एक अभिव्यक्ति है लेकिन जब मूल्यांकन किया जाता है, तो यह केवल एक अपवाद फेंकता है, कभी भी कोई मूल्य नहीं लौटाता है।

सांख्यिकीय रूप से टाइप की गई प्रोग्रामिंग भाषा में, प्रत्येक अभिव्यक्ति का एक प्रकार होता है। हालाँकि, यह परिभाषा गतिशील रूप से टाइप की गई प्रोग्रामिंग भाषा में काम नहीं करती है।

व्यक्तिगत रूप से, मैं एक अभिव्यक्ति को सिंटैक्स के एक टुकड़े के रूप में परिभाषित करता हूं जिसे एक बड़े अभिव्यक्ति के लिए एक ऑपरेटर या फ़ंक्शन कॉल के साथ बनाया जा सकता है। यह वास्तव में विकिपीडिया द्वारा अभिव्यक्ति की व्याख्या के समान है:

यह एक या एक से अधिक स्थिरांक, चर, फ़ंक्शंस, और ऑपरेटरों का एक संयोजन है जो प्रोग्रामिंग भाषा की व्याख्या करती है (इसकी विशेष नियमों और संघ की शर्तों के अनुसार) और उत्पादन करने के लिए गणना करता है ("लौटने के लिए", एक राज्य के माहौल में) एक और मूल्य

लेकिन, समस्या C प्रोग्रामिंग लैंग्वेज में है, जिसे फंक्शन निष्पादित किया जाता है।

void executeSomething(void){
    return;
}

है executeSomething()एक अभिव्यक्ति है या यह एक बयान है? मेरी परिभाषा के अनुसार, यह एक बयान है क्योंकि जैसा कि माइक्रोसॉफ्ट के सी संदर्भ व्याकरण में परिभाषित किया गया है,

आप किसी भी प्रकार से शून्य होने वाले अभिव्यक्ति के (कोई भी) मूल्य का उपयोग नहीं कर सकते हैं, और न ही आप शून्य को छोड़कर किसी भी प्रकार के लिए एक शून्य अभिव्यक्ति (अंतर्निहित या स्पष्ट रूपांतरण) में परिवर्तित कर सकते हैं।

लेकिन एक ही पृष्ठ स्पष्ट रूप से इंगित करता है कि इस तरह के वाक्यविन्यास एक अभिव्यक्ति है।


-6

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

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

इस से यह इस प्रकार है कि एक बयान केवल एक कार्यक्रम में कोई प्रभाव डाल सकता है जब यह एक साइड-इफ़ेक्ट बनाता है, क्योंकि यह या तो एक मूल्य वापस नहीं कर सकता है या यह केवल यूनिट प्रकार का मान लौटाता है जो या तो गैर-संज्ञा है (कुछ भाषाओं में) C का void) या (जैसे कि स्काला में) कथन के विलंबित मूल्यांकन के लिए संग्रहीत किया जा सकता है।

जाहिर है @pragmaया /*comment*/कोई भी प्रकार नहीं है और इस तरह बयानों से अलग है। इस प्रकार केवल एक प्रकार का बयान जिसका कोई दुष्प्रभाव नहीं होगा, एक गैर-ऑपरेशन होगा। नॉन-ऑपरेशन केवल भविष्य के दुष्प्रभावों के लिए प्लेसहोल्डर के रूप में उपयोगी है। एक बयान के कारण कोई अन्य कार्रवाई एक साइड-इफेक्ट होगी। फिर एक संकलक संकेत, उदाहरण के लिए @pragma, एक बयान नहीं है क्योंकि इसका कोई प्रकार नहीं है।


2
भेद का भाव के प्रकार से कोई लेना-देना नहीं है। कई भाषाओं में सिंथेटिक परिभाषित कथनों का कोई प्रकार नहीं है। हालांकि मैं सिद्धांत में इस तरह के शब्दों पर एक प्रकार असाइन करने के खिलाफ नहीं हूं, लेकिन अलग-अलग उपचार पर @pragmaया /*comment*/तार्किक रूप से असंगत हैं।
फ्रैंकएचबी

-11

सबसे सटीक रूप से, एक बयान में "साइड-इफेक्ट" (यानी अनिवार्य होना चाहिए) और एक अभिव्यक्ति का एक मूल्य प्रकार होना चाहिए (यानी नीचे का प्रकार नहीं)।

एक बयान के प्रकार इकाई प्रकार है, लेकिन कारण लंगड़ा को प्रमेय इकाई कथा है, इसलिए कहते हैं कि सुविधा देता है नीचे प्रकार


Voidनीचे का प्रकार ठीक नहीं है (यह सभी संभावित प्रकारों का उपप्रकार नहीं है)। यह उन भाषाओं में मौजूद है जिनके पास पूरी तरह से ध्वनि प्रकार की प्रणाली नहीं है । यह एक तड़क-भड़क वाले कथन की तरह लग सकता है, लेकिन पूर्णता जैसे एनोटेशन एक्स्टेंसिबल सॉफ़्टवेयर लिखने के लिए महत्वपूर्ण हैं।

आइए देखें कि इस मामले पर विकिपीडिया का क्या कहना है।

https://en.wikipedia.org/wiki/Statement_(computer_science)

कंप्यूटर प्रोग्रामिंग में एक स्टेटमेंट एक अनिवार्य प्रोग्रामिंग लैंग्वेज का सबसे छोटा स्टैंडअलोन एलिमेंट है, जो कुछ एक्शन को अंजाम देता है।

कई भाषाएं (जैसे C) कथन और परिभाषाओं के बीच एक अंतर बनाती हैं, जिसमें एक कथन केवल निष्पादन योग्य कोड होता है और एक पहचानकर्ता घोषित करने वाली परिभाषा होती है, जबकि एक अभिव्यक्ति केवल एक मूल्य का मूल्यांकन करती है।


5
एक बयान का साइड इफेक्ट नहीं होना चाहिए। उदाहरण के लिए, अजगर passमें एक बयान है। यह एक नो-ऑप है, और यह किसी भी चीज़ का मूल्यांकन नहीं करता है।
मैथ्यू Schinckel

9
-1 यह गलत है। एक बयान में यह नहीं है है एक पक्ष प्रभाव है। C # भाषा विशिष्टता का अनुभाग 1.5 देखें । न केवल यह निर्दिष्ट नहीं करता है कि बयानों के साइड-इफेक्ट्स होने चाहिए , बल्कि यह कई बयानों को सूचीबद्ध करता है जिनके कोई दुष्प्रभाव नहीं हो सकते हैं ।
NullUserException

2
@NullUserException मैंने उस अनुभाग को पढ़ा। घोषणा, अभिव्यक्ति, चयन, Iteration, और जम्प स्टेटमेंट सभी दुष्प्रभाव पैदा कर सकते हैं। लेकिन अगर कोई आरटी अभिव्यक्ति है, तो यह एक बयान नहीं है। मुझे लगता है कि विनिर्देश बयानों के साथ भावों को बराबर कर रहा है, लेकिन इस सवाल ने उनके बीच अंतर पूछा। तो या तो सवाल का कोई जवाब नहीं है, या आप सी # कल्पना भी शाब्दिक रूप से ले रहे हैं। शीर्ष मतदान का उत्तर यह बताने की कोशिश कर रहा है कि मैंने क्या किया। लेकिन "कुछ करता है" अर्थहीन है। "साइड-इफ़ेक्ट" "कुछ करने" का सार्थक तरीका है। हमें सोचना है, न कि केवल पुनर्जन्म।
शेल्बी मूर III

13
@ShelbyMooreIII आप सही हैं। आधिकारिक दस्तावेज गलत है । मार्क ग्रेवेल और जॉन स्कीट, जो संभवतः एरिक लिपर्ट के बाहर एसओ पर सक्रिय सबसे अधिक सम्मान सी # पोस्टर हैं, गलत हैं । मैं, और अन्य सभी जिन्होंने आपको पद छोड़ दिया और टिप्पणी छोड़ कर बताया कि हमारी स्थिति गलत है । तुम सही हो। आप स्पष्ट रूप से एकमात्र व्यक्ति हैं जो जानते हैं कि वे किस बारे में बात कर रहे हैं, क्योंकि आप बाकी के सभी एसओ की तुलना में बहुत चालाक हैं।
NullUserException

3
बयान, अभिव्यक्ति, कास्ट, रूपांतरण आदि जैसी अवधारणाओं की सटीक परिभाषा जानने से प्रतिदिन प्रोग्रामिंग कार्यों के 99.999% पर शून्य प्रभाव पड़ता है। के बारे में सोचो कि । इसके अलावा: ज्यादातर लोग हास्केल और स्काला के बारे में परवाह नहीं करते हैं।
NullUserException
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.