2011-01-24 14 views
5

में कॉमा ऑपरेटर मैंने कई जगहों पर पढ़ा है लेकिन मैं वास्तव में सशर्त में निर्दिष्ट व्यवहार को समझ नहीं पा रहा हूं।एक सशर्त

मैं समझता हूं कि असाइनमेंट में यह पहले ऑपरेंड का मूल्यांकन करता है, परिणाम को छोड़ देता है, फिर दूसरे ऑपरेंड का मूल्यांकन करता है।

लेकिन इस कोड के लिए, यह क्या करना चाहिए?

CPartFile* partfile = (CPartFile*)lParam; 
ASSERT(partfile != NULL); 
bool bDeleted = false; 
if (partfile,bDeleted) 
    partfile->PerformFileCompleteEnd(wParam); 

आईएफ में भागफाइल एक अनावश्यक तर्क था, या इसका कोई अर्थ है?

+0

शायद यह मदद मिलेगी: http://stackoverflow.com/questions/54142/c-comma-operator –

+0

एक संभावना है कि कोडर का मतलब था 'अगर (partfile && bDeleted)', कुछ अन्य प्रोग्रामिंग भाषाओं में 'IF a, b'' का मतलब है "अगर ए और बी" –

उत्तर

9

इस मामले में, यह एक अनावश्यक अभिव्यक्ति है, और कोड के अर्थ को बदले बिना हटाया जा सकता है।

+3

अल्पविराम ऑपरेटर अतिसंवेदनशील है। शायद इसका उपयोग बाएं हाथ अभिव्यक्ति की स्थिति बदल सकता है। – Benoit

+0

@ बेनोइट इसे दो आदिम प्रकारों के लिए ओवरलोड नहीं किया जा सकता है (हालांकि इस मामले में सूचक और बूल); कम से कम एक ऑपरेंड में कक्षा का प्रकार होना चाहिए –

4

अल्पविराम ऑपरेटर पहले आइटम की अभिव्यक्ति करता है, परिणामों को त्याग देता है, फिर अंतिम अभिव्यक्ति के रूप में परिणाम का मूल्यांकन करता है।

तो partfile,bDeleted evaulate जो भी partfile, कि परिणाम छोड़ दिए जाएंगे, तो मूल्यांकन करें और bDeleted

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

अधिक जानकारी के लिए, Wikipedia: Comma operator

+0

अल्पविराम ऑपरेटर एन -1 आइटम का मूल्यांकन नहीं करता है। सी/सी ++ में प्रत्येक ऑपरेटर या तो यूनरी या बाइनरी है। यदि आप एक लाइन पर कई कॉमा ऑपरेटर डालते हैं, तो यह पहले आइटम का मूल्यांकन करेगा, इसे छोड़ देगा, दूसरे आइटम का मूल्यांकन करेगा, और दूसरे आइटम को लाइन पर अगले कॉमा ऑपरेटर के लिए ऑपरेंड के रूप में उपयोग करेगा। निस्संदेह परिणाम वही होगा जैसे उसने एन -1 आइटम का मूल्यांकन किया था, लेकिन यह समझने के लिए कि आपको अंतिम आइटम पर जाने के लिए क्या हो रहा है, यह जानने की जरूरत है। – Lundin

+0

अच्छा बिंदु, मैं सोच रहा था कि ए, बी, सी एक शब्द था (क्या यह सही शब्द है?), लेकिन यह सच नहीं है क्योंकि वहां दो कॉमा ऑपरेटर हैं। फिक्स्ड पोस्ट – helloworld922

1

partfile मूल्यांकन किया जाता है, तो bDeleted मूल्यांकन किया है और परीक्षण के रूप में प्रयोग किया जाता है। चूंकि पार्टफाइल के मूल्यांकन का कोई साइड इफेक्ट नहीं होता है, इसलिए इसे सशर्त से हटाकर कोई प्रभाव नहीं पड़ता है।

+0

आपके पास यह पिछड़ा है, पार्टफाइल का मूल्यांकन किया जाता है और अनदेखा किया जाता है और बीडीलेट हटाया जाता है और लौटाया जाता है। – helloworld922

+0

@ helloworld922: इतना सच है, ठीक हो जाएगा। – ThomasMcLeod

2
bool bDeleted = false; 
if (partfile,bDeleted) 
    partfile->PerformFileCompleteEnd(wParam); 

यहाँ, if बयान partfile, bDeleted का मूल्यांकन करता है, लेकिन bDelete हमेशा गलत तो अभिव्यक्ति को चलाने के लिए विफल रहता है है। मुख्य सवाल यह है कि "यह सब क्या है?"। संभावित उत्तर यह है कि कोई अस्थायी रूप से partfile->PerformFileCompleteEnd(wParam); कथन को चलने से रोकना चाहता था, शायद इसलिए कि यह कुछ समस्या पैदा कर रहा था या वे यह सुनिश्चित करना चाहते थे कि बाद में कोड सही ढंग से त्रुटियों की सूचना दी जाए, यदि वह चरण नहीं किया गया था। ताकि वे याद रखें कि कोड कैसे उपयोग किया जाता था, उन्होंने पुराने "if (partfile)" तर्क को छोड़ दिया, लेकिन दस्तावेज़ के लिए एक हार्डकोडेड bDeleted चर जोड़ा जो partfile->Perform... तर्क प्रभावी ढंग से प्रोग्राम से "हटाया गया" था।

एक बेहतर तरीका अस्थायी रूप से इस तरह के कोड को निष्क्रिय करने के शायद

#if 0 
    if (partfile) 
     partfile->PerformFileCompleteEnd(wParam); 
#endif 

है ... ... यद्यपि कभी कभी मैं तर्क भी दस्तावेज़ के लिए प्रयास करें ...

#ifndef DONT_BYPASS_FILE_COMPLETE_PROCESSING_DURING_DEBUGGING 
    if (partfile) 
     partfile->PerformFileCompleteEnd(wParam); 
#endif 

... या ...

if (partFile, !"FIXME remove this after debugging") 
    partfile->PerformFileCompleteEnd(wParam); 

सबसे अच्छा विकल्प आपके टूल सेट और मौजूदा आदतों पर निर्भर करता है (उदाहरण के लिए कुछ संपादक "फिक्स" और "TODO" रिवर्स वीडियो में इसलिए #if 0 ब्लॉक को मिस या ग्रे करना मुश्किल है; आपके पास विशेष स्रोत हो सकते हैं जो आपके स्रोत-नियंत्रण चेकइन के बारे में चेतावनी देते हैं; प्रीप्रोसेसर केवल डीबग बनाम रिलीज बिल्ड में परिभाषित करता है आकस्मिक वितरण आदि को रोक सकता है)।

1

कॉमा ऑपरेटर सी/सी ++ की एक अस्पष्ट विशेषता है। इसे प्रारंभिक सूचियों (यानी: int x, int y;) में अल्पविराम से भ्रमित नहीं किया जाना चाहिए और न ही फ़ंक्शन कॉल पैरामीटर अलगाव कॉमा (यानी: func (x, y))।

अल्पविराम ऑपरेटर का एक ही उद्देश्य है: प्रोग्रामर को अभिव्यक्ति के मूल्यांकन का एक गारंटीकृत आदेश देने के लिए। सी/सी ++ में लगभग हर ऑपरेटर के लिए, अभिव्यक्तियों के मूल्यांकन का क्रम अनिर्धारित है। अगर मैं

परिणाम = x + y लिखता हूं;

जहां x और y subexpressions हैं, तो या तो x या y का मूल्यांकन पहले किया जा सकता है। मैं नहीं जानता कि यह कंपाइलर पर निर्भर है। यदि आप

परिणाम = x, y लिखते हैं;

मूल्यांकन के आदेश मानक द्वारा गारंटीकृत है: पहले छोड़ दिया गया।

बेशक

, असली दुनिया अनुप्रयोगों में इस का उपयोग करता है काफी सीमित हैं ...

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