मैं c # के संबंध में पूछ रहा हूं, लेकिन मैं इसे अन्य सभी भाषाओं में समान मानता हूं।
क्या किसी के पास अभिव्यक्ति और बयानों की अच्छी परिभाषा है और अंतर क्या हैं?
मैं c # के संबंध में पूछ रहा हूं, लेकिन मैं इसे अन्य सभी भाषाओं में समान मानता हूं।
क्या किसी के पास अभिव्यक्ति और बयानों की अच्छी परिभाषा है और अंतर क्या हैं?
जवाबों:
अभिव्यक्ति: कुछ जो एक मूल्य का मूल्यांकन करता है। उदाहरण: 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
और कभी-कभी लोग दोहराव चाहते हैं जो वहां नहीं है: मानक सी में, उदाहरण के लिए, केवल एक बयान एक नए स्थानीय चर की घोषणा कर सकता है - लेकिन यह क्षमता पर्याप्त उपयोगी है कि जीएनयू सी कंपाइलर एक जीएनयू एक्सटेंशन प्रदान करता है जो एक अभिव्यक्ति को घोषित करने में सक्षम बनाता है स्थानीय चर भी।
अन्य भाषाओं के डिजाइनरों ने इस तरह के दोहराव को पसंद नहीं किया, और उन्होंने इस पर जल्दी देखा कि यदि अभिव्यक्तियों के साथ-साथ मूल्यों पर भी दुष्प्रभाव हो सकते हैं, तो बयानों और अभिव्यक्तियों के बीच वाक्यविन्यास अंतर यह सब उपयोगी नहीं है - इसलिए उन्होंने इससे छुटकारा पा लिया । हास्केल, आइकन, लिस्प और एमएल सभी भाषाएं हैं जिनमें वाक्यविन्यास कथन नहीं हैं - उनके केवल भाव हैं। यहां तक कि वर्ग संरचित लूपिंग और सशर्त रूपों को अभिव्यक्ति माना जाता है, और उनके पास मूल्य हैं - लेकिन बहुत दिलचस्प नहीं हैं।
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
whereहै कि वास्तव में फ़ंक्शन घोषणा का एक हिस्सा है, न कि अभिव्यक्ति या कथन।
ध्यान दें कि C में, "=" वास्तव में एक ऑपरेटर है, जो दो चीजें करता है:
यहाँ ANSI C व्याकरण से एक अर्क है। आप देख सकते हैं कि C में कई भिन्न प्रकार के कथन नहीं हैं ... एक कार्यक्रम में अधिकांश कथन अभिव्यक्ति कथन हैं, अर्थात अंत में अर्धविराम के साथ एक अभिव्यक्ति।
statement
: labeled_statement
| compound_statement
| expression_statement
| selection_statement
| iteration_statement
| jump_statement
;
expression_statement
: ';'
| expression ';'
;
एक अभिव्यक्ति एक ऐसी चीज है जो एक मूल्य लौटाती है, जबकि एक बयान नहीं करता है।
उदाहरण के लिए:
1 + 2 * 4 * foo.bar() //Expression
foo.voidFunc(1); //Statement
दोनों के बीच बड़ा सौदा यह है कि आप भावों को एक साथ जोड़ सकते हैं, जबकि कथन जंजीर नहीं हो सकते।
foo.voidFunc(1);एक शून्य मान के साथ एक अभिव्यक्ति है। whileऔर ifबयान हैं।
returnकि इसे एक सबस्टेशन माना जाता है।
आप इसे विकिपीडिया पर पा सकते हैं , लेकिन अभिव्यक्तियों का मूल्यांकन कुछ मूल्य के लिए किया जाता है, जबकि बयानों का कोई मूल्यांकन मूल्य नहीं है।
इस प्रकार, अभिव्यक्तियों को बयानों में इस्तेमाल किया जा सकता है, लेकिन आसपास के अन्य तरीके से नहीं।
ध्यान दें कि कुछ भाषाएं (जैसे लिस्प, और मेरा मानना है कि रूबी, और कई अन्य) कथन बनाम अभिव्यक्ति को अलग नहीं करते हैं ... ऐसी भाषाओं में, सब कुछ एक अभिव्यक्ति है और अन्य अभिव्यक्तियों के साथ जंजीर हो सकती है।
अभिव्यक्ति बनाम कथनों की रचनाशीलता (श्रृंखलाबद्धता) में महत्वपूर्ण अंतर की व्याख्या के लिए, मेरा पसंदीदा संदर्भ जॉन बैकस का ट्यूरिंग अवार्ड पेपर है, क्या प्रोग्रामिंग को वॉन न्यूमैन शैली से मुक्त किया जा सकता है? ।
इम्पीरेटिव भाषाएं (फोरट्रान, सी, जावा, ...) संरचित कार्यक्रमों के लिए कथनों पर जोर देती हैं, और एक तरह के विचार के बाद अभिव्यक्ति होती हैं। कार्यात्मक भाषाएं भावों पर जोर देती हैं। विशुद्ध रूप से कार्यात्मक भाषाओं में बयानों की तुलना में ऐसी शक्तिशाली अभिव्यक्तियाँ हैं जिन्हें पूरी तरह से समाप्त किया जा सकता है।
एक मूल्य प्राप्त करने के लिए अभिव्यक्तियों का मूल्यांकन किया जा सकता है, जबकि कथन एक मान नहीं देते हैं (वे प्रकार शून्य हैं )।
फ़ंक्शन कॉल अभिव्यक्तियों को भी निश्चित रूप से स्टेटमेंट माना जा सकता है, लेकिन जब तक कि निष्पादन वातावरण में एक विशेष अंतर्निहित वैरिएबल नहीं होता है, तो लौटाया गया मान रखने के लिए, कोई तरीका नहीं है।
कथन-उन्मुख भाषाओं के लिए सभी प्रक्रियाओं को कथनों की एक सूची की आवश्यकता होती है। अभिव्यक्ति-उन्मुख भाषाएं, जो संभवतः सभी कार्यात्मक भाषाएं हैं, अभिव्यक्तियों की सूची है, या एलआईएसपी के थेए मामले में, एक लंबी एस-अभिव्यक्ति जो अभिव्यक्तियों की सूची का प्रतिनिधित्व करती है।
यद्यपि दोनों प्रकारों की रचना की जा सकती है, लेकिन अधिकांश भावों की रचना मनमाने ढंग से की जा सकती है जब तक कि प्रकार मेल खाते हैं। प्रत्येक प्रकार के कथन का अन्य कथनों की रचना का अपना तरीका है, यदि वे ऐसा कर सकते हैं। फॉरचेट और यदि बयानों के लिए या तो एक ही क़ानून की आवश्यकता होती है या यह कि सभी अधीनस्थ कथन एक स्टेटमेंट ब्लॉक में जाते हैं, एक के बाद एक, जब तक कि सबस्टेशन अपने स्वयं के सबस्टेशन की अनुमति नहीं देते।
कथन में ऐसे भाव भी शामिल हो सकते हैं, जहाँ अभिव्यक्ति में वास्तव में कोई कथन शामिल नहीं है। एक अपवाद, हालांकि, एक लैम्ब्डा अभिव्यक्ति होगा, जो एक फ़ंक्शन का प्रतिनिधित्व करता है, और इसलिए कुछ भी फ़ंक्शन शामिल कर सकता है जब तक कि भाषा केवल सीमित लैम्ब्डा के लिए अनुमति नहीं देती है, जैसे कि पायथन का एकल-एक्सप्रेशन लैम्ब्डा।
एक अभिव्यक्ति-आधारित भाषा में, आपको एक फ़ंक्शन के लिए एक एकल अभिव्यक्ति की आवश्यकता होती है क्योंकि सभी नियंत्रण संरचनाएं एक मान लौटाती हैं (उनमें से बहुत से रिटर्न वापस मिल जाती है)। फ़ंक्शन में अंतिम मूल्यांकित अभिव्यक्ति के बाद से रिटर्न स्टेटमेंट की कोई आवश्यकता नहीं है।
Voidनीचे प्रकार नहीं है। मेरा जवाब देखिए ।
null)? यूनिट प्रकार (लेकिन इसके एकल मूल्य के साथ दुर्गम) की voidतरह अधिक नहीं होगा ?
voidकोई फ़ंक्शन का रिटर्न प्रकार है जो कभी नहीं लौटता है (उदाहरण के लिए एक फ़ंक्शन जो throwएक त्रुटि है), तो यह नीचे का प्रकार है । अन्यथा voidहै इकाई प्रकार । आप सही हैं कि एक स्टेटमेंट जो डायवर्ज नहीं कर सकता है, उसका यूनिट प्रकार है। लेकिन एक कथन जो मोड़ सकता है वह है नीचे का प्रकार। हाल्टिंग प्रमेय के कारण, हम आमतौर पर यह साबित नहीं कर सकते कि कोई कार्य नहीं होता है, इसलिए मुझे लगता है कि इकाई कल्पना है। नीचे के प्रकार का मान नहीं हो सकता, इसलिए इसका एक भी मान नहीं हो सकता null।
nullमूल्य वास्तव में एक छद्मसूत्र है जो यह दर्शाता है कि एक संदर्भ का मतलब है कि कुछ मौजूद नहीं है।
बस: एक अभिव्यक्ति एक मूल्य का मूल्यांकन करता है, एक बयान नहीं करता है।
{}एक कथन है। शब्द को डराने वाले उद्धरणों में रखने से वह परिवर्तित नहीं होता है। कथन शब्दार्थ के साथ वाक्य रचना हैं। "शब्दार्थ परत" जैसी कोई चीज नहीं है - आप निष्पादन के लिए संदर्भित करते हैं । आप कहते हैं कि आप सटीक होने की कोशिश कर रहे हैं, लेकिन आप उस पर विफल रहे हैं। "डाउन-वोटर्स की अज्ञानता" के बारे में आपकी शिकायत शुद्ध विज्ञापन समरूपता है; आपको डाउनवोटर्स की मानसिक स्थिति के बारे में कोई जानकारी नहीं है।
{}सी # भाषा युक्ति में एक कथन के रूप में परिभाषित किया गया है।
अभिव्यक्ति आधारित भाषाओं के बारे में कुछ बातें:
सबसे महत्वपूर्ण: सब कुछ एक मूल्य देता है
कोड ब्लॉक और अभिव्यक्तियों को परिसीमित करने के लिए घुंघराले कोष्ठक और ब्रेसिज़ के बीच कोई अंतर नहीं है, क्योंकि सब कुछ एक अभिव्यक्ति है। हालांकि यह लेक्सिकल स्कूपिंग को नहीं रोकता है: एक स्थानीय चर को उस अभिव्यक्ति के लिए परिभाषित किया जा सकता है जिसमें इसकी परिभाषा निहित है और उदाहरण के लिए उसके भीतर निहित सभी कथन।
अभिव्यक्ति आधारित भाषा में, सब कुछ एक मूल्य देता है। यह पहली बार में थोड़ा अजीब हो सकता है - क्या (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
)
एक कथन एक अभिव्यक्ति का एक विशेष मामला है, एक 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।
कथन -> निर्देश क्रमिक रूप से पालन करने के लिए
-> मूल्यांकन जो एक मान लौटाता है
स्टेटमेंट मूल रूप से एक एल्गोरिथम में दिए गए कदमों या निर्देशों की तरह होते हैं, एक स्टेटमेंट के निष्पादन का परिणाम इंस्ट्रक्शन पॉइंटर (तथाकथित असेंबलर में) की प्राप्ति है।
अभिव्यक्तियाँ पहली नज़र में आदेश और क्रियान्वयन नहीं करती हैं, उनका उद्देश्य मूल्य का मूल्यांकन और वापस करना है। अनिवार्य प्रोग्रामिंग भाषाओं में एक अभिव्यक्ति के मूल्यांकन का एक आदेश होता है, लेकिन यह केवल अनिवार्य मॉडल के कारण होता है, लेकिन यह उनका सार नहीं है।
कथन के उदाहरण:
for
goto
return
if
(उन सभी को एक और लाइन के निष्पादन की लाइन (स्टेटमेंट) का अग्रिम मतलब है)
अभिव्यक्तियों का उदाहरण:
2+2
(यह निष्पादन का विचार नहीं है, लेकिन मूल्यांकन का)
कथन ,
एक बयान एक प्रक्रियात्मक इमारत-ब्लॉक है जिसमें से सभी 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;}:)
मैं statementशब्द के औपचारिक तर्क अर्थ में अर्थ को प्राथमिकता देता हूं । यह वह है जो गणना में एक या एक से अधिक चर की स्थिति को बदल देता है, जिससे उनके मूल्य (ओं) के बारे में सही या गलत कथन को सक्षम किया जा सकता है।
मुझे लगता है कि नई शब्दावली या शब्दों को पेश किए जाने पर सामान्य रूप से कंप्यूटिंग की दुनिया और विज्ञान में हमेशा भ्रम की स्थिति रहेगी, मौजूदा शब्द 'पुनर्खरीद' हैं या उपयोगकर्ता मौजूदा, स्थापित या 'उचित' शब्दावली से अनभिज्ञ हैं, जिसका वे वर्णन कर रहे हैं
मैं यहाँ किसी भी उत्तर से वास्तव में संतुष्ट नहीं हूँ। मैंने सी ++ (आईएसओ 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 ++ में कथन माना जाता है।
caseउदाहरण के लिए एक लेबल-स्टेटमेंट हैif if/else,casewhile, do...while,for (...)break, continue, return(अभिव्यक्ति लौट सकते हैं),gototry/catchब्लॉक हैयह एक अंश है जो भावों को दर्शाता है:
expression:
assignment-expression
expression "," assignment-expression
assignment-expression:
conditional-expression
logical-or-expression assignment-operator initializer-clause
throw-expression
+, -, *, /, &, |, &&, ||, ...)throwखंड एक अभिव्यक्ति भी हैकथन व्याकरणिक रूप से पूर्ण वाक्य हैं। भाव नहीं हैं। उदाहरण के लिए
x = 5
"x 5 हो जाता है" के रूप में पढ़ता है यह पूरा वाकया है। कोड
(x + 5)/9.0
पढ़ता है, "x प्लस 5 सभी 9.0 से विभाजित।" यह पूर्ण वाक्य नहीं है। बयान
while k < 10:
print k
k += 1
एक पूर्ण वाक्य है। ध्यान दें कि लूप हैडर नहीं है; "जबकि के <10," एक अधीनस्थ खंड है।
whileएक अभिव्यक्ति है, जैसे स्काला। आप टाइपिंग के साथ व्याकरण का सामना कर रहे हैं। मेरा जवाब देखिए ।
whileशरीर के साथ अभी भी स्काला में एक अभिव्यक्ति है। यह एक बयान भी हो सकता है अगर यह दुष्प्रभाव पैदा करता है, जो कि मेरे भारी डाउनवॉट जवाब की अनुमति देता है (एक अभिव्यक्ति भी एक बयान हो सकती है)। मेरा उत्तर एकमात्र सही है। उन सभी पाठकों को क्षमा करें जो समझ नहीं सकते हैं।
(x + 5)/9.0निश्चित रूप से एक बयान के रूप में अकेले खड़े हो सकते हैं। साथ ही, यदि व्याकरणिक रूप से पूर्ण होने पर, आपका मतलब एक वैध कार्यक्रम है, तो C केवल एक कार्यक्रम के रूप में बयानों को अकेले खड़े होने की अनुमति नहीं देता है।
यहाँ एक सबसे आसान जवाब है जो मुझे मिला।
मूल रूप से एंडर्स कासेगोर द्वारा उत्तर दिया गया
एक बयान कोड की एक पूरी लाइन है जो कुछ कार्रवाई करता है, जबकि एक अभिव्यक्ति कोड का कोई भी अनुभाग है जो एक मूल्य का मूल्यांकन करता है।
अभिव्यक्तियों को "क्षैतिज" रूप से संचालकों का उपयोग करके बड़े अभिव्यक्तियों में जोड़ा जा सकता है, जबकि बयानों को केवल एक के बाद एक या ब्लॉक निर्माणों के साथ लिखकर "लंबवत" जोड़ा जा सकता है।
प्रत्येक अभिव्यक्ति को एक कथन के रूप में इस्तेमाल किया जा सकता है (जिसका प्रभाव अभिव्यक्ति का मूल्यांकन करना और परिणामी मूल्य की उपेक्षा करना है), लेकिन अधिकांश कथनों को अभिव्यक्ति के रूप में उपयोग नहीं किया जा सकता है।
इन अवधारणाओं का वास्तविक आधार है:
अभिव्यक्तियाँ : एक वाक्यात्मक श्रेणी जिसका उदाहरण एक मूल्य के लिए मूल्यांकन किया जा सकता है।
कथन : एक वाक्यात्मक श्रेणी जिसका उदाहरण अभिव्यक्ति के मूल्यांकन और मूल्यांकन के परिणामस्वरूप मूल्य (यदि कोई हो) उपलब्ध नहीं है के साथ शामिल हो सकता है।
प्रारंभिक दशकों में फोरट्रान के लिए बहुत प्रारंभिक संदर्भ के अलावा, स्वीकृत उत्तर में अभिव्यक्तियों और बयानों की दोनों परिभाषाएं स्पष्ट रूप से गलत हैं:
sizeofऑपरेटर के संचालन के रूप में प्रयुक्त एक अभिव्यक्ति का मूल्यांकन कभी नहीं किया जाता है।(बीटीडब्लू, मैं सी के बारे में सामग्री से संबंधित उस उत्तर को [उद्धरण वांछित] जोड़ना चाहता हूं क्योंकि मुझे याद नहीं आ रहा है कि क्या डीएमआर के पास ऐसी राय है। ऐसा नहीं लगता है, अन्यथा सी के डिजाइन में कार्यक्षमता दोहराव को संरक्षित करने के लिए कोई कारण नहीं होना चाहिए। : विशेष रूप से, अल्पविराम ऑपरेटर बनाम बयान।)
(निम्नलिखित तर्क मूल प्रश्न का सीधा जवाब नहीं है, लेकिन मुझे लगता है कि पहले से ही यहां बताए गए कुछ को स्पष्ट करना आवश्यक है।)
फिर भी, यह संदिग्ध है कि हमें सामान्य प्रयोजन की प्रोग्रामिंग भाषाओं में "बयानों" की एक विशिष्ट श्रेणी की आवश्यकता है:
beginयोजना में) या मोनडिक संरचनाओं के सिंटैक्टिक चीनी द्वारा प्रतिस्थापित किया जा सकता है ।++i + ++iसी में अर्थहीन है।)तो बयान क्यों? वैसे भी, इतिहास पहले से ही एक गड़बड़ है। ऐसा लगता है कि अधिकांश भाषा डिजाइनर अपनी पसंद का ध्यान नहीं रखते हैं।
इससे भी बदतर, यह कुछ प्रकार के सिस्टम के प्रति उत्साही (जो पीएल इतिहास से परिचित नहीं हैं) को भी कुछ गलत धारणाएं देता है, जो कि प्रकार के सिस्टम में परिचालन शब्दार्थ पर नियमों के अधिक आवश्यक डिजाइन के साथ करने के लिए महत्वपूर्ण चीजें होनी चाहिए।
गंभीरता से, प्रकारों के आधार पर तर्क कई मामलों में उतना बुरा नहीं है, लेकिन विशेष रूप से इस विशेष में रचनात्मक नहीं है। यहां तक कि विशेषज्ञ चीजों को पेंच कर सकते हैं।
उदाहरण के लिए, कोई व्यक्ति अच्छी तरह से टाइप करने वाली प्रकृति पर जोर देता है, जो कि सीमांत निरंतरता के पारंपरिक उपचार के खिलाफ केंद्रीय तर्क है । हालांकि निष्कर्ष कुछ हद तक उचित है और रचित कार्यों के बारे में जानकारी ठीक है ( लेकिन अभी भी बहुत सारगर्भित है ), यह तर्क ध्वनि नहीं है क्योंकि यह पूरी तरह से "साइड चैनल" के दृष्टिकोण को अनदेखा करता है जैसे _Noreturn any_of_returnable_types(सी 11 में) सांकेतिक शब्दों में बदलना Falsum। और कड़ाई से बोलते हुए, अप्रत्याशित राज्य के साथ एक सार मशीन "दुर्घटनाग्रस्त कंप्यूटर" के समान नहीं है।
एक बयान-उन्मुख प्रोग्रामिंग भाषा में, एक कोड ब्लॉक को बयानों की एक सूची के रूप में परिभाषित किया गया है। दूसरे शब्दों में, एक वाक्य वाक्य रचना का एक टुकड़ा है जिसे आप एक सिंटैक्स त्रुटि के कारण के बिना एक कोड ब्लॉक के अंदर रख सकते हैं।
विकिपीडिया शब्द कथन को इसी तरह परिभाषित करता है
कंप्यूटर प्रोग्रामिंग में, एक स्टेटमेंट एक अनिवार्य प्रोग्रामिंग लैंग्वेज की एक सिंटैक्टिक यूनिट होती है जो कुछ कार्रवाई को अंजाम देती है। ऐसी भाषा में लिखा गया कार्यक्रम एक या अधिक कथनों के अनुक्रम द्वारा बनता है
बाद वाले बयान पर गौर करें। (हालांकि इस मामले में "एक कार्यक्रम" तकनीकी रूप से गलत है क्योंकि सी और जावा दोनों एक कार्यक्रम को अस्वीकार करते हैं जिसमें बयानों का कुछ भी नहीं होता है।)
विकिपीडिया शब्द अभिव्यक्ति को परिभाषित करता है
एक प्रोग्रामिंग भाषा में एक अभिव्यक्ति एक वाक्यात्मक इकाई है जिसका मूल्यांकन इसके मूल्य को निर्धारित करने के लिए किया जा सकता है
यह, हालांकि, गलत है, क्योंकि कोटलिन में, throw new Exception("")एक अभिव्यक्ति है लेकिन जब मूल्यांकन किया जाता है, तो यह केवल एक अपवाद फेंकता है, कभी भी कोई मूल्य नहीं लौटाता है।
सांख्यिकीय रूप से टाइप की गई प्रोग्रामिंग भाषा में, प्रत्येक अभिव्यक्ति का एक प्रकार होता है। हालाँकि, यह परिभाषा गतिशील रूप से टाइप की गई प्रोग्रामिंग भाषा में काम नहीं करती है।
व्यक्तिगत रूप से, मैं एक अभिव्यक्ति को सिंटैक्स के एक टुकड़े के रूप में परिभाषित करता हूं जिसे एक बड़े अभिव्यक्ति के लिए एक ऑपरेटर या फ़ंक्शन कॉल के साथ बनाया जा सकता है। यह वास्तव में विकिपीडिया द्वारा अभिव्यक्ति की व्याख्या के समान है:
यह एक या एक से अधिक स्थिरांक, चर, फ़ंक्शंस, और ऑपरेटरों का एक संयोजन है जो प्रोग्रामिंग भाषा की व्याख्या करती है (इसकी विशेष नियमों और संघ की शर्तों के अनुसार) और उत्पादन करने के लिए गणना करता है ("लौटने के लिए", एक राज्य के माहौल में) एक और मूल्य
लेकिन, समस्या C प्रोग्रामिंग लैंग्वेज में है, जिसे फंक्शन निष्पादित किया जाता है।
void executeSomething(void){
return;
}
है executeSomething()एक अभिव्यक्ति है या यह एक बयान है? मेरी परिभाषा के अनुसार, यह एक बयान है क्योंकि जैसा कि माइक्रोसॉफ्ट के सी संदर्भ व्याकरण में परिभाषित किया गया है,
आप किसी भी प्रकार से शून्य होने वाले अभिव्यक्ति के (कोई भी) मूल्य का उपयोग नहीं कर सकते हैं, और न ही आप शून्य को छोड़कर किसी भी प्रकार के लिए एक शून्य अभिव्यक्ति (अंतर्निहित या स्पष्ट रूपांतरण) में परिवर्तित कर सकते हैं।
लेकिन एक ही पृष्ठ स्पष्ट रूप से इंगित करता है कि इस तरह के वाक्यविन्यास एक अभिव्यक्ति है।
मेरे पूर्व उत्तर को सुधारने और मान्य करने के लिए, जब लागू हो, तो कंप्यूटर विज्ञान प्रकार के सिद्धांत से प्रोग्रामिंग भाषा की शर्तों को स्पष्ट किया जाना चाहिए।
एक अभिव्यक्ति के नीचे के प्रकार के अलावा एक प्रकार होता है, अर्थात इसका एक मूल्य होता है। एक स्टेटमेंट में यूनिट या बॉटम टाइप होता है।
इस से यह इस प्रकार है कि एक बयान केवल एक कार्यक्रम में कोई प्रभाव डाल सकता है जब यह एक साइड-इफ़ेक्ट बनाता है, क्योंकि यह या तो एक मूल्य वापस नहीं कर सकता है या यह केवल यूनिट प्रकार का मान लौटाता है जो या तो गैर-संज्ञा है (कुछ भाषाओं में) C का void) या (जैसे कि स्काला में) कथन के विलंबित मूल्यांकन के लिए संग्रहीत किया जा सकता है।
जाहिर है @pragmaया /*comment*/कोई भी प्रकार नहीं है और इस तरह बयानों से अलग है। इस प्रकार केवल एक प्रकार का बयान जिसका कोई दुष्प्रभाव नहीं होगा, एक गैर-ऑपरेशन होगा। नॉन-ऑपरेशन केवल भविष्य के दुष्प्रभावों के लिए प्लेसहोल्डर के रूप में उपयोगी है। एक बयान के कारण कोई अन्य कार्रवाई एक साइड-इफेक्ट होगी। फिर एक संकलक संकेत, उदाहरण के लिए @pragma, एक बयान नहीं है क्योंकि इसका कोई प्रकार नहीं है।
@pragmaया /*comment*/तार्किक रूप से असंगत हैं।
सबसे सटीक रूप से, एक बयान में "साइड-इफेक्ट" (यानी अनिवार्य होना चाहिए) और एक अभिव्यक्ति का एक मूल्य प्रकार होना चाहिए (यानी नीचे का प्रकार नहीं)।
एक बयान के प्रकार इकाई प्रकार है, लेकिन कारण लंगड़ा को प्रमेय इकाई कथा है, इसलिए कहते हैं कि सुविधा देता है नीचे प्रकार ।
Voidनीचे का प्रकार ठीक नहीं है (यह सभी संभावित प्रकारों का उपप्रकार नहीं है)। यह उन भाषाओं में मौजूद है जिनके पास पूरी तरह से ध्वनि प्रकार की प्रणाली नहीं है । यह एक तड़क-भड़क वाले कथन की तरह लग सकता है, लेकिन पूर्णता जैसे एनोटेशन एक्स्टेंसिबल सॉफ़्टवेयर लिखने के लिए महत्वपूर्ण हैं।
आइए देखें कि इस मामले पर विकिपीडिया का क्या कहना है।
https://en.wikipedia.org/wiki/Statement_(computer_science)
कंप्यूटर प्रोग्रामिंग में एक स्टेटमेंट एक अनिवार्य प्रोग्रामिंग लैंग्वेज का सबसे छोटा स्टैंडअलोन एलिमेंट है, जो कुछ एक्शन को अंजाम देता है।
कई भाषाएं (जैसे C) कथन और परिभाषाओं के बीच एक अंतर बनाती हैं, जिसमें एक कथन केवल निष्पादन योग्य कोड होता है और एक पहचानकर्ता घोषित करने वाली परिभाषा होती है, जबकि एक अभिव्यक्ति केवल एक मूल्य का मूल्यांकन करती है।
passमें एक बयान है। यह एक नो-ऑप है, और यह किसी भी चीज़ का मूल्यांकन नहीं करता है।