2016-07-04 7 views
5

भाषा मानक का कहना है:सी ++ "घोषणा और प्रारंभिकरण" कथन है, एक अभिव्यक्ति?

[नोट: खण्ड 5 वाक्य रचना, मूल्यांकन के आदेश, और अर्थ को परिभाषित करता है की एक अभिव्यक्ति expressions.58 ऑपरेटरों और ऑपरेंड है कि एक गणना निर्दिष्ट करता है का एक क्रम है। एक अभिव्यक्ति के परिणामस्वरूप मान हो सकता है और साइड इफेक्ट्स का कारण बन सकता है। - अंत नोट]

उदा। मेरे पास नीचे कोड है:

int i=1; 
A obj; 

तो, ऊपर दिए गए दोनों कथन, "अभिव्यक्ति" के रूप में गिनें?

स्टैक ओवरफ्लो पर कुछ लोग कहते हैं "int i = 1;" एक अभिव्यक्ति नहीं है। यह मेरे लिए काफी अजीब है।

(1) प्रारंभिकरण "गणना" का एक प्रकार है, है ना? तो इसे "अभिव्यक्ति" के रूप में माना जाना चाहिए?

(2) एक ओबीजे; // एक ctor invokes। एक सीटीआर गणना की तरह है, तो इसे "अभिव्यक्ति" के रूप में माना जाना चाहिए?

+0

संभावित डुप्लिकेट [सी ++ में अभिव्यक्ति और अभिव्यक्ति कथन क्या है?] (Http: // stackoverflow।कॉम/प्रश्न/7479 9 46/व्हाट्स-ए-एक्सप्रेशन-एंड-एक्सप्रेशन-स्टेटमेंट-इन-सी) –

+0

अंगूठे का एक साधारण नियम यह है कि अभिव्यक्ति में सेमी-कोलन नहीं होते हैं। अर्ध-कोलन जोड़ना उन्हें बयान में बदल देता है। इसके अलावा, एक अभिव्यक्ति कुछ है जो आप कोष्ठक के साथ लपेट सकते हैं और किसी अन्य अभिव्यक्ति के अंदर उपयोग कर सकते हैं। आप 'x = (int i = 1;)' नहीं लिख सकते हैं। –

+0

व्याकरण की जांच करें, मैंने इसे यहां निकाला है: https://github.com/o11c/chintzy/blob/master-py/chintzy/_std/cxx14.py#L559 – o11c

उत्तर

6

मानक में गैर-मानक नोट अभिव्यक्ति की अवधारणा को प्रेरित करने के लिए है, लेकिन वास्तविक परिभाषा नहीं है। अभिव्यक्ति की परिभाषा भाषा व्याकरण में दी गई है जो धारा 5 के शेष में दी गई है। अभिव्यक्तियां कुछ टर्मिनल जैसे अक्षर, चर के नाम और कार्यों के नामों से बनाई गई हैं, जो अंकगणित जैसे ऑपरेटरों का उपयोग करके संयुक्त होते हैं और संबंध ऑपरेटर।

घोषणाएं और अभिव्यक्ति अलग वाक्य रचनात्मक संस्थाएं हैं, इसलिए सी ++ प्रोग्राम के अंदर एक घोषणा कभी अभिव्यक्ति नहीं होती है, और इसके विपरीत। अंतर एक नज़र में देखने के लिए काफी आसान है: अगर यह कुछ घोषित करता है, तो यह एक घोषणा है।

1;   // expression statement 
int i = 1; // declaration statement that declares `i` 
A(i, 42); // expression statement that creates an A object 
A a(i);  // declaration statement that declares an A object (named a) 

एक घोषणा भाव मूल्यांकन कर सकते हैं लेकिन एक घोषणा एक अभिव्यक्ति नहीं है। आप सही मायने में बताते हैं कि कक्षा के किसी ऑब्जेक्ट की घोषणा एक कन्स्ट्रक्टर कॉल का कारण बन सकती है। फिर भी यह वाक्य रचनात्मक रूप से एक घोषणा है और अभिव्यक्ति नहीं है।

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

f(i++) + g(); // i may be incremented before or after g() is called... 
h();   // but definitely before h() is called. 

ऐसे नियमों के प्रयोजनों के लिए, एकल चर की घोषणा और प्रारंभिकता को पूर्ण अभिव्यक्ति भी माना जाता है। कक्षा प्रकार के चर के मामले में, कन्स्ट्रक्टर कॉल उस अभिव्यक्ति का हिस्सा है।

int i = 1;      // this declaration evaluates a full-expression 
           // whose effect is to initialize `i` to 1 
int j = f(i++) + g(), k = h(); // two separate full-expressions; 
           // i is incremented before h() is called 

जब मानक पढ़ना, आप क्रम में संदर्भ विचार करने के लिए यह पता लगाने की "अभिव्यक्ति" का क्या अर्थ का मतलब है की जरूरत है।

+0

एक घोषणा एक अभिव्यक्ति नहीं है; कुछ "पूर्ण अभिव्यक्ति" अभिव्यक्ति नहीं हैं। मानक को "पूर्ण अभिव्यक्ति" का उपयोग हर बार करना चाहिए जिसका अर्थ है पूर्ण अभिव्यक्ति –

+0

असल में, 'ए (i); 'एक घोषणा है। –

+0

@VaughnCato मेरा बुरा, ठीक हो जाएगा। – Brian

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