2010-06-27 18 views
8

आप इस कोड को देखते हैं, तोजब सभी अल्पविराम ऑपरेटर अल्पविराम ऑपरेटर के रूप में कार्य नहीं करते हैं?

class A{ 
public: 
    A(int a):var(a){} 
    int var; 
}; 

int f(A obj) { 
    return obj.var; 
} 

int main() { 
    //std::cout<<f(23); // output: 23 
    std::cout<<f(23, 23); // error: too many arguments to function 'int f(A)' 
    return 0; 
} 

f(23, 23) संकलन नहीं करता है क्योंकि एक विभाजक यहाँ और नहीं एक अल्पविराम ऑपरेटर के रूप में के रूप में अल्पविराम कार्य करता है।

जहां सभी एक अल्पविराम अल्पविराम ऑपरेटर के रूप में काम करते हैं? या फिर इसके विपरीत?

उत्तर

11

का मूल्यांकन करेंगे है के साथ एक समारोह कॉल अभिव्यक्ति है, एक समारोह कॉल के मापदंडों एक वैकल्पिक अभिव्यक्ति-सूची के लिए फार्म कोष्ठक के अंदर। एक अभिव्यक्ति-सूची में एक या अधिक असाइनमेंट-अभिव्यक्ति को अल्पविराम टोकन से अलग किया गया है। एक अल्पविराम केवल एक अल्पविराम ऑपरेटर को इंगित कर सकता है जहां अभिव्यक्ति अपेक्षित है।

अल्पविराम ऑपरेटर एक अभिव्यक्ति, एक , और एक काम अभिव्यक्ति, लेकिन एक अभिव्यक्ति एक अल्पविराम ऑपरेटर को शामिल नहीं अपने आप में एक काम अभिव्यक्ति तो कर सकते हैं है 'के बाहर एक अभिव्यक्ति बनाता है अभिव्यक्ति-सूची में दिखाई देता है, सिवाय इसके कि यह असाइनमेंट-अभिव्यक्ति है।

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

उदा।

पोस्टफ़िक्स अभिव्यक्ति जहां अभिव्यक्ति-सूची दो काम अभिव्यक्ति जिनमें से प्रत्येक के होते हैं एक पहचानकर्ता है।

f(a, b); 

पोस्टफ़िक्स अभिव्यक्ति जहां अभिव्यक्ति-सूची एक भी काम अभिव्यक्ति जो एक प्राथमिक अभिव्यक्ति जो एक parenthesized अभिव्यक्ति अल्पविराम ऑपरेटर का उपयोग है के होते हैं।

f((a, b)); 
8

एक ऑपरेटर के रूप में अल्पविराम टोकन के उपयोग फ़ंक्शन कॉल और परिभाषाओं, चर घोषणाओं, enum घोषणाओं, और इसी तरह के निर्माणों, जहां यह एक विभाजक के रूप में कार्य करता है में इसके उपयोग से अलग है।

Wikipedia - Comma operator

+4

"समान संरचनाएं" क्या हैं? – Philipp

+0

@ फिलिप: मूल रूप से, वे संरचनाएं जिनमें व्याकरण स्पष्ट रूप से अल्पविराम के अर्थ का वर्णन करता है। उपर्युक्त सूची उदाहरण सदस्य और मित्र घोषणाओं के लिए छोड़ती है, जो परिवर्तनीय घोषणाओं के समान हैं। एक और उदाहरण एक अस्थायी ऑब्जेक्ट अभिव्यक्ति होगी जैसे 'कॉम्प्लेक्स (0,1)' जो फ़ंक्शन कॉल के समान है। सुपर संक्षिप्त उत्तर के लिए – MSalters

+0

+1। – stinky472

1

अल्पविराम ऑपरेटर हमेशा एक अल्पविराम ऑपरेटर के रूप में कार्य करता है, लेकिन एक अल्पविराम हमेशा एक अल्पविराम ऑपरेटर नहीं होता - कभी कभी यह सिर्फ विराम चिह्न है।

जब यह विराम चिह्न होता है, तो सरल जवाब "जब मानक कहता है।" उन सभी परिस्थितियों में जाकर जहां मानक कहता है, इतना लंबा जवाब देता है - लेकिन एक ऐसा जो अधिक उपयोगी होने की संभावना नहीं है, क्योंकि (एक उदाहरण के लिए) इसे कई कोने के मामलों से निपटना पड़ता है, ज्यादातर लोग ज्यादा परवाह नहीं करते हैं के बारे में।

7

इसे अभिव्यक्तियों की भाषा परिभाषा के साथ करना है, जो काफी जटिल है।

f(1, 2) दो पैरामीटर के साथ एक फ़ंक्शन कॉल अभिव्यक्ति है। इसके विपरीत, f((1, 2)) एक पैरामीटर, जो उप अभिव्यक्ति 1, 2 है, जो देखने के एक व्याकरण की दृष्टि से करने के लिए 2.

+0

क्योंकि अल्पविराम यहां एक ऑपरेटर है! सही अभिव्यक्ति का परिणाम वापस कर दिया गया है। बस किसी भी पाठक को स्पष्टीकरण के लिए –

8

मैंने ड्राफ्ट मानक पर एक खोज की। असल में, व्याकरण में -list प्रोडक्शंस वे हैं जिनके पास विभिन्न वस्तुओं को अलग करने के लिए अल्पविराम होते हैं। निम्नलिखित परिणाम सी ++ 03 विशिष्ट हैं। सी ++ 0x में, अभिव्यक्ति-सूची सीधे प्रारंभकर्ता-सूची पर प्रतिनिधि करती है क्योंकि सी ++ 0x ब्रेस सूचियों में फ़ंक्शन और कन्स्ट्रक्टर तर्कों में भी हो सकता है।

  • अभिव्यक्ति-सूचीसमारोह/निर्माता तर्क के लिए (कार्यात्मक डाले सहित)
  • प्रगणक-सूची एक गणन
  • init-declarator-सूची की वस्तुओं की सूची एक घोषणा में घोषित विभिन्न नाम

    उदाहरण:

    int a, b; 
    
  • पैरामीटर-घोषणा-सूचीपैरामीटर घोषणा सूची एक समारोह
  • प्रारंभकर्ता-सूची अभिव्यक्ति-सूची में सूची समान की (! आश्चर्य), लेकिन ब्रेस्ड अभिव्यक्ति सूचियों को शामिल कर सकते हैं। कुल प्रारंभ (आरंभ सरणियों या structs)
  • सदस्य-declarator-सूची init declarator सूची में इसी प्रकार के लिए प्रयोग किया जाता है, लेकिन सदस्य घोषणाओं कक्षाओं में के लिए।

    उदाहरण:

    struct A { int a, b; }; 
    
  • आधार विनिर्देशक-सूचीआधार वर्गों एक वर्ग के की सूची।
  • मेम-प्रारंभकर्ता-सूचीसदस्यों

    उदाहरण के लिए initializers की सूची:

    struct A { A():a(0), b(0) { } int a; int b; }; 
    
  • टेम्पलेट पैरामीटर-सूचीकी सूची टेम्पलेट पैरामीटर घोषणाओं।
  • टेम्पलेट-तर्क-सूचीटेम्पलेट तर्क की एक टेम्पलेट में पास की गई।
  • प्रकार-आईडी-सूचीअपवाद विनिर्देशों के लिए प्रकार की सूची

    उदाहरण:

    void f() throw(int, bool) { } 
    

वहाँ मैक्रो मापदंडों के लिए एक पहचानकर्ता-सूची भी, मैं जो है उस सूची में नहीं मिला है क्योंकि यह वास्तव में प्रीप्रोसेसर व्याकरण का हिस्सा है।

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