2008-09-29 19 views
39

सी/सी ++ में निम्न कोड क्या करता है?अल्पविराम ऑपरेटर क्या करता है?

if (blah(), 5) { 
    //do something 
} 
+2

एक बहुत लोड सवाल। +1 – jop

+0

होमवर्क की तरह बदबू आ रही है। – jfm3

+0

प्रश्न में भाषा निर्दिष्ट करनी चाहिए; मुझे नहीं लगता कि टैगिंग पर्याप्त होगी, भले ही इसमें सी और सी ++ टैग दोनों न हों। –

उत्तर

66

कॉमा ऑपरेटर लागू किया गया है और मूल्य 5 का उपयोग सशर्त के सत्य/झूठे को निर्धारित करने के लिए किया जाता है।

यह blah() को निष्पादित करेगा और कुछ वापस ले जाएगा (संभवतः), तो अल्पविराम ऑपरेटर नियोजित है और 5 एकमात्र चीज होगी जिसका उपयोग अभिव्यक्ति के लिए सही/गलत मान निर्धारित करने के लिए किया जाता है।


ध्यान दें कि, ऑपरेटर blah() फ़ंक्शन (जो निर्दिष्ट नहीं किया गया) की वापसी के प्रकार के लिए अतिभारित किया जा सकता है, परिणाम अस्पष्ट बना रही है।

+0

दिलचस्प (कम से कम मेरे लिए), यह है कि जब आप अल्पविराम ऑपरेटर को अधिभारित करते हैं तो संचालन का क्रम सुनिश्चित नहीं किया जाता है। आम तौर पर, मुझे नहीं लगता कि मैं कभी ऐसा करता हूं। – itsmatt

+0

यह दिलचस्प है ... –

+0

मुझे एक बग की याद दिलाती है जिसे मैंने कुछ दिन पहले लिखा था: लिखना चाहता था (डी, एफ); लेकिन सीएनओब्जेक्ट ए = (डी, एफ) लिखना घायल; दुर्भाग्य से एफ के प्रकार से CANObject में एक रूपांतरण था। Awch। – QBziZ

1

मैं कहूंगा कि blah() पर निर्भर करता है।

+0

ब्लाह() को बुलाया जाएगा और हम दुष्प्रभावों को नहीं जानते हैं। तो सवाल का जवाब "यह कोड क्या करेगा?" संभव नहीं है। –

+0

मैं आपसे सहमत हूं, बेन। निश्चित रूप से कहने के लिए पर्याप्त जानकारी नहीं है। उदाहरण के लिए – itsmatt

+0

, अपवाद। या यदि आप सी पसंद करते हैं, तो गोटो। – tfinniga

45

अल्पविराम ऑपरेटर अतिभारित नहीं है, तो कोड इस के समान है: अल्पविराम ऑपरेटर ओवरलोड हो गया है

blah(); 
if (5) { 
    // do something 
} 

हैं, नतीजा यह है कि कार्य के आधार पर की जाएगी।

#include <iostream> 
#include <string> 

using namespace std; 

string blah() 
{ 
    return "blah"; 
} 

bool operator,(const string& key, const int& val) { 
    return false; 
} 

int main (int argc, char * const argv[]) { 

    if (blah(), 5) { 
     cout << "if block"; 
    } else { 
     cout << "else block"; 
    } 

    return 0; 
} 

+0

नहीं, सी ++ ऑपरेटर है, यहां ध्यान देने के लिए –

+0

हाँ - भूल गया कि आप सी ++ में अल्पविराम ऑपरेटर को ओवरराइड कर सकते हैं। मुझे लगता है कि इस सवाल का असली बिंदु है! – jop

0

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

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

blah(); 
// do something 

के रूप में इस कोड लिख सकते हैं।

+0

हाँ, दुर्भाग्य से किसी को ब्लाह() एक ऑब्जेक्ट लौटा सकता है जिसकी कक्षा ने अल्पविराम ऑपरेटर को अधिभारित किया था और फिर कौन जानता है कि वास्तव में क्या होगा। अल्पविराम ऑपरेटर 5 से कुछ की तुलना कर सकता है और झूठी वापसी कर सकता है, कोड को पूरी तरह से ब्रैकेट में छोड़ देता है। – itsmatt

+0

यदि यह सी ++ बिल्कुल है (यहां तक ​​कि एक सी ++ प्रोजेक्ट में फ़ाइलों की सूची के बीच एक सादा सी फ़ाइल हो सकती है); एक सी ++ टैग है, लेकिन एक सी टैग भी है और यह बाहरी "सी" ब्लॉक के भीतर भी हो सकता है, जिस स्थिति में कोई ओवरलोडिंग संभव नहीं है। – Mecki

13

रोग मामले में, यह क्या अल्पविराम ऑपरेटर करता है पर निर्भर करता है ...

class PlaceHolder 
{ 
}; 

PlaceHolder Blah() { return PlaceHolder(); } 

bool operator,(PlaceHolder, int) { return false; } 

if (Blah(), 5) 
{ 
    cout << "This will never run."; 
} 
20

मैं एक बात है कि कोड के इस प्रकार करना चाहिए पता है: यह सांकेतिक शब्दों में बदलनेवाला निकाल दिया जाना चाहिए। मैं इस तरह लिखने वाले किसी के बगल में काम करने के लिए बहुत डर दूंगा।

1

अधिक विस्तृत उत्तर पर। अल्पविराम ऑपरेटर (गैर अधिभारित) के रूप में हल होता है, पहले भाग को निष्पादित करता है और दूसरा भाग वापस करता है।

तो यदि आपके पास (foo(), bar()) दोनों कार्य निष्पादित किए जाएंगे, लेकिन अभिव्यक्ति का मान बार() (और अभिव्यक्ति का प्रकार भी) का मूल्यांकन करता है।

जबकि मैं नहीं कहूंगा कि इसके लिए उचित उपयोग हैं, आमतौर पर कोड पढ़ने के लिए थोड़ा मुश्किल माना जाता है। मुख्य रूप से क्योंकि कई भाषाएं ऐसी संरचनाओं को साझा नहीं करती हैं। तो अंगूठे के व्यक्तिगत नियम के रूप में मैं इसे तब तक टालता हूं जब तक कि मैं एक पूर्ववर्ती अभिव्यक्ति में कोड जोड़ रहा हूं और पूरी तरह से अपना प्रारूप बदलना नहीं चाहता हूं।

उदाहरण: मैं एक मैक्रो है

FIND_SOMETHING (एक्स) (एक्स> 2) (नहीं पर चर्चा करता है, तो आप मैक्रो का उपयोग करना चाहिए या नहीं, कभी कभी अपने नहीं तुम भी है कि यह लिखा था)? find_fruits (x): find_houses (x)

और मैं आमतौर पर इसे my_possession = FIND_SOMETHING (34) जैसे असाइनमेंट में उपयोग करता हूं;

अब मैं डीबगिन उद्देश्यों के लिए लॉग जोड़ना चाहता हूं लेकिन मैं खोज कार्यों को नहीं बदल सकता। मैं कर सकता था:

FIND_SOMETHING (X) (x> 2)? (LOG ("फलों की तलाश"), find_fruits (x)) :(LOG ("घरों की तलाश"), find_houses (x))

0

मैं कभी-कभी डिबगिंग उद्देश्यों के लिए इस तरह का निर्माण करता हूं। जब मैं ब्ला के वापसी मूल्य के बावजूद सत्य होने के करीब मजबूर करता हूं। यह स्पष्ट है कि इसे कभी भी उत्पादन कोड में प्रकट नहीं होना चाहिए।

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