इस C ++ कार्यक्षमता का नाम क्या है?


82

मैं कुछ C ++ कोड लिख रहा था और गलती से एक फ़ंक्शन का नाम छोड़ दिया WSASocket। हालाँकि, मेरे संकलक ने एक त्रुटि नहीं उठाई और मुझे SOCKETमान्य सॉकेट के बजाय पूर्णांक मान 1 से संबद्ध किया ।

प्रश्न में कोड इस तरह देखा जाना चाहिए:

this->listener = WSASocket(address->ai_family, address->ai_socktype, address->ai_protocol, NULL, NULL, WSA_FLAG_OVERLAPPED);

लेकिन इसके बजाय, यह इस तरह दिखता था:

this->listener = (address->ai_family, address->ai_socktype, address->ai_protocol, NULL, NULL, WSA_FLAG_OVERLAPPED);

अन्य भाषाओं से आते हुए, ऐसा लगता है कि यह किसी प्रकार का अनाम प्रकार हो सकता है। सुविधा का नाम क्या है, इस मामले में यह वास्तव में एक विशेषता है?

इसका उद्देश्य क्या है?

इसके लिए खोज करना मुश्किल है, जब आप नहीं जानते कि कहां से शुरू करें।


3
+1, पब क्विज़ के लिए अच्छा प्रश्न (या फर्मों के लिए एक भयावह साक्षात्कार प्रश्न जो उन लोगों को काम पर रखना पसंद करते हैं जो मस्तिष्क टीज़र में अच्छे हैं)।
बाथशीबा

8
अल्पविराम ऑपरेटर पर विकिपीडिया लेख के लिए लिंक । Fwiw, आम उपयोग में से एक एक में दो साइड इफेक्ट प्राप्त करने के लिए है forपाश * यात्रा अभिव्यक्ति , ala के लिए (int i = 0, जे = 0; मैं <10; ++ मैं, --j) ... `
टोनी डेलरॉय

1
@ MichaelJ.Gray तकनीकी रूप से आप गलत हैं। यह व्यवहार को अधिलेखित नहीं कर रहा है। इमेजिन: i=0;j=0;x=i++,j=6;x और j 6 होंगे और मैं वैसे भी होगा। 1. यदि i ++ का व्यवहार ओवरराइट हो जाएगा तो यह 0. ही रहेगा। लेकिन प्रत्येक स्टेटमेंट को आमंत्रित किया जाता है और पहुंचने के बाद ,सभी एक्सटेंशनों को छोड़ दिया जाता है और अगले छद्म अनुक्रम को लागू किया जाता है। तो पहले =सिर्फ आखिरी के बाद के हिस्से को असाइन करता है ,लेकिन प्रत्येक बिंदु को लागू किया जाता है। वैसे भी: मुझे नहीं लगता कि आपका कंपाइलर आपको फ़ंक्शन डिक्लेरेशन के पुनर्परिभाषित की चेतावनी क्यों नहीं देता है और इसके बजाय आपके व्यवहार को कुछ अलग करने के लिए कोड बदलता है
dhein

5
यदि आप एक उचित संकलक का उपयोग करते हैं, तो चेतावनियों के साथ, यह ऐसे डोडी कोड के बारे में चेतावनी देगा, उदाहरण के लिए gccऔर विकल्प के g++साथ -Wallकहें:warning: left-hand operand of comma expression has no effect [-Wunused-value]
सैम वॉटकिंस

3
इसलिए, मेरी राय में इस सवाल का सबसे अच्छा जवाब "हमेशा चेतावनी को सक्षम करना" है - फिर कंपाइलर खुद को समझाएगा कि एक त्रुटि है और आपको बताए कि आपने क्या किया; और यह उत्तर आपके लिए कई अन्य समस्याओं को भी हल करेगा।
सैम वाटकिंस

जवाबों:


151

अल्पविराम ऑपरेटर left बाएं हाथ की ओर का मूल्यांकन करता है, इसके मूल्य को बताता है, और परिणामस्वरूप दाहिने हाथ की ओर पैदावार देता है। WSA_FLAG_OVERLAPPED1 है, और यह अभिव्यक्ति का परिणाम है; अन्य सभी मानों को छोड़ दिया गया है। कोई भी सॉकेट कभी नहीं बनाया जाता है।


Load जब तक ओवरलोड न हो। हां, इसे ओवरलोड किया जा सकता है। नहीं, आपको इसे अधिभार नहीं देना चाहिए। कीबोर्ड से दूर हटो, अभी!


9
+1, आत्मा को बहुत प्रभावी ढंग से बढ़ावा देता है, अल्पविराम ऑपरेटर को अधिभारित करता है, लेकिन यह नियम के लिए बहुत अकेला अपवाद है: ऐसा न करें
बाथशीबा

2
@Bathsheba Boost.Assign भी अल्पविराम ऑपरेटर को अधिभारित करता है, लेकिन C ++ 11 के बाद से कौन उपयोग करता है?
रूबनेव

39
लेकिन आपके पास सबसे अच्छा स्पष्टीकरण था कि ताकतवर अल्पविराम कितना खतरनाक हो सकता है। अनफ़ोरगिविंग और उपहास से भरा हुआ, इसने मेरे कोड को कई मिनटों तक भुनाया, जबकि मुझे उसके व्यवहार के लिए कोई शर्म नहीं है।
माइकल जे। ग्रे


1
@ R.MartinhoFernandes - ईगन भी बहुत प्रभावी रूप से अल्पविराम ऑपरेटर को अधिभारित करता है। कुछ नमूना उपयोग के लिए यह एसई प्रश्न देखें ।
डेविड हैमेन

22

अल्पविराम ऑपरेटर अपने कोड की भावना रही है।

आप प्रभावी रूप से सेट कर रहे हैं, this->listener = WSA_FLAG_OVERLAPPED;जो सिर्फ सिंटिक रूप से मान्य है


3
न केवल वाक्यात्मक रूप से मान्य, बल्कि चूंकि Windows API सुरक्षित नहीं है, इसलिए यह एक मान्य रूपांतरण भी है।
9


1
यही कारण है कि एक एकल तर्क के साथ कॉल करने योग्य निर्माता स्पष्ट होना चाहिए , फिर एक कंपाइलर त्रुटि हुई होगी और डेवलपर को इस विचित्र निर्माण पर दूसरी नज़र डालने का मौका मिला होगा।
Matthieu M.

@MSalters खैर, के SOCKETलिए एक typedef है unsigned int, और WSA_FLAG_OVERLAPPEDएक intशाब्दिक है। के SOCKETलिए एक पर्याय बन गया था int, यह भी एक रूपांतरण नहीं होगा ।
जोकर_vD

1
@ जोकर_वद: वास्तव में। अगर उन्होंने इसके लिए एक टाइफाइड बनाया है struct __socket*, तो हमारे पास कम कीड़े होंगे। लेकिन वहाँ बहुत अधिक कोड है जो "जानता है" SOCKETअभिन्न है।
एमएसलटर्स

21

कंपाइलर कोष्ठक के भीतर प्रत्येक क्रम बिंदु का मूल्यांकन कर रहा है और परिणाम अभिव्यक्ति में अंतिम WSA_FLAG_OVERLAPPEDअभिव्यक्ति है।

अल्पविराम ऑपरेटर ,सी ++ में एक अनुक्रम बिंदु है। कॉमा के बाईं ओर की अभिव्यक्ति पूरी तरह से मूल्यांकन से पहले दाईं ओर होती है। परिणाम हमेशा सही के लिए मूल्य है। जब आपको फॉर्म (X1, x2, x3, ..., xn) की अभिव्यक्ति मिली है, तो अभिव्यक्ति का परिणाम हमेशा होता है xn


आपके द्वारा अपना स्पष्टीकरण वहां जोड़ने के बाद, यह अधिक समझ में आता है। मैं अनुक्रम बिंदु मुद्दे की प्रासंगिकता को पहले नहीं समझ पाया।
माइकल जे। ग्रे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.