2011-12-15 13 views
5

मेरे पास तीन कोड स्निपेट हैं। यह एक:अल्पविराम के साथ यह डबल प्रारंभिक क्यों अवैध है?

1,7; //yes, that's all the code 

ठीक है। यह एक:

double d = (1, 7); 

भी ठीक संकलित करता है। फिर भी यह एक:

double d = 1, 7; 

संकलन करने में विफल रहता है। जीसीसी-4.3.4 कहते

error: expected unqualified-id before numeric constant

और विजुअल C++ 10 कहते हैं

error C2059: syntax error : 'constant'

क्यों इस तरह के अंतर है? सभी तीनों में , के साथ सभी तीनों में समान प्रभाव क्यों नहीं है?

+3

मुझे लगता है कि व्याकरण वास्तव में काफी 'इलाज के लिए डबल d = 1, 7 बालों होगा,' एक भी declarator, '1 के साथ, 7' प्रारंभकर्ता अभिव्यक्ति के रूप में के रूप में है, जबकि' इलाज डबल घ = 1, ई = 7; 'दो घोषणाकर्ताओं के रूप में। या आप आगे भी जाएंगे, और कहेंगे कि अगर पहले से ही 'e' गुंजाइश है तो' डबल डी = 1, ई = 7; '* * को * एक घोषणाकर्ता के रूप में भी माना जाना चाहिए, प्रारंभकर्ता अभिव्यक्ति' 1, ई के साथ = 7'? मैं भ्रम के लिए बहुत सारी संभावनाएं देखता हूं, बस 'डबल डी = (1, 7) मामले में कुछ माता-पिता टाइप करने के लिए;' जो वैसे भी व्यर्थ है। –

उत्तर

13

पहले दो मामलों में, बयानों का उपयोग कर रहे सी ++ के comma operator

उत्तरार्द्ध मामले में, अल्पविराम चर अलग रूप में इस्तेमाल किया जा रहा है और संकलक एकाधिक पहचानकर्ताओं घोषित करने के लिए आप उम्मीद कर रही है; कॉमा को ऑपरेटर के रूप में इस्तेमाल नहीं किया जा रहा है।

double d = 1, 7; 

संकलक एक चर पहचानकर्ता और नहीं एक अंकीय निरंतर उम्मीद: जब आप ऐसा करते

float x,y; 
float a = 10, b = 20; 

:

पिछले मामले की तरह कुछ के समान है। इसलिए 7 यहां अवैध है।

हालांकि आप ऐसा करते हैं जब:

double d = (1,7); 

सामान्य अल्पविराम ऑपरेटर प्रयोग किया जाता है किया जा रहा: 1 का मूल्यांकन किया जाता है और त्यागने जबकि 7 घ में संग्रहित है।

+0

+1: हां, जवाब अनिवार्य रूप से है "क्योंकि व्याकरण ऐसा कहता है"। –

+5

"कॉमा ऑपरेटर का सामान्य रूप से उपयोग नहीं किया जा रहा है" - सटीक होने के लिए, कॉमा टोकन कॉमा ऑपरेटर नहीं है। यह दो घोषणाकर्ताओं के बीच एक विभाजक है, और '7' वैध घोषणाकर्ता नहीं है। –

+0

धन्यवाद स्टीव। मेरा उत्तर अपडेट किया गया :-) – sharjeel

0

मेरा मानना ​​है कि ऐसा इसलिए है क्योंकि पिछले एक (गलत) घोषणा पंक्ति के रूप में व्यवहार किया जाता है: (double d = 1), (7)

+0

यदि यह मामला था, तो इसे संकलित करना चाहिए, जैसे कि 1,7; कर देता है। – Nikodemus

+0

1,7; मूल रूप से एक बहुत ही सरल कथन है, इसलिए इसे कंपाइलर द्वारा अनुमत किया जाता है ... आपकी अंतिम पंक्ति एक गलत घोषणा है। – DejanLekic

+0

लाइन को 'डबल (डी = 1), (7) के रूप में माना जा रहा है; और एक चर के रूप में एक संख्या' डबल 7' से शुरू नहीं हो सकता है एक वाक्यविन्यास त्रुटि है –

5

अंतर यह है कि 1, 7; में और (1, 7) आप भाव है जहां एक अल्पविराम ऑपरेटर अनुमति दी है है।

आपकी आखिरी उदाहरण

double d = 1, 7; 

एक घोषणा, जहां अल्पविराम एक ऑपरेटर लेकिन एक विभाजक नहीं है। कंपाइलर

double d = 1, e = 7; 

जैसी कुछ निष्पादित करता है जो एक सही परिवर्तनीय घोषणा होगी।

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

3
  1. double d = (1, 7); यहाँ (1, 7) पहले मूल्यांकन किया जाएगा; कॉमा अनुक्रमिक-मूल्यांकन ऑपरेटर, और 7 को d पर असाइन किया जाएगा।

  2. double d = 1, 7; इस मामले में कोई समस्या है: भाग से पहले अल्पविराम मतलब है कि आप एक डबल घोषित करने और अपने मूल्य निर्धारित करते हैं, लेकिन भाग के बाद अल्पविराम व्यर्थ है, क्योंकि यह सिर्फ एक पूर्णांक निरंतर है ।

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