2011-11-16 15 views
7

मैं बस कोड के इस टुकड़े में भाग गया जो यह करता है:सी/सी ++ सिंटेक्स - इसके बजाय बयान अलग करना; कानूनी?

delete a, a = 0; 

यह संकलित करता है और ठीक चलता है। लेकिन यह ऐसा नहीं होना चाहिए:

delete a; 
a = 0; 

इस मामले में अनुमति देने वाले बयान को अलग क्यों कर रहा है?

धन्यवाद :)

+3

इसे अल्पविराम ऑपरेटर कहा जाता है: http://www.cplusplus.com/doc/tutorial/operators/। –

+2

यह एक उत्तर होना चाहिए, एक टिप्पणी नहीं। – Mysticial

+0

बेशक, यहां उदाहरण सी ++ है, सी नहीं। :-) – ibid

उत्तर

6

यह अल्पविराम ऑपरेटर है। यह दोनों तर्कों का मूल्यांकन करता है और दूसरा लौटाता है।

+0

@ मंकर्स: पहले ही तय किया गया है, धन्यवाद। –

5

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

+0

आप अल्पविराम के साथ एक ही प्रकार की कई घोषणाएं पेश कर सकते हैं। –

7

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

5

यह comma operator है। एमएसडीएन लेख here है। और यह समझने के लिए this प्रश्न देखें कि यह कैसे काम करता है।

1

हालांकि इस तरह कोड लिखना संभव है, यह कुछ हद तक अजीब हो सकता है।

struct T { 
    bool check() const; 
    void fix(); 
}; 

अब आप struct में सब कुछ के माध्यम से पुनरावृति करने के लिए और चलाने के लिए उस पर जांच करें और फोन को ठीक करता है, तो जांच झूठे रिटर्न चाहते हैं: एक से थोड़ा अधिक यथार्थवादी USECASE यदि आप इस प्रकार एक struct T है किया जाएगा। ऐसा करने का सरल तरीका

for (list<T>::iterator it = mylist.begin(); it < mylist.end(); ++it) 
    if (!it->check()) 
     it->fix(); 

आइए दिखाएं कि आप इसे यथासंभव कम से कम लिखना चाहते हैं। fix() लौटने का मतलब है कि आप इसे केवल स्थिति में नहीं डाल सकते हैं। हालांकि, अल्पविराम ऑपरेटर का उपयोग आप इस के आसपास मिल सकती है:

for (auto it = mylist.begin(); it != mylist.end() && (it->check() || (it->fix(), true)); ++it); 

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