2011-07-13 15 views
8

संभावित डुप्लिकेट:
&&= and ||= operatorsसी/सी ++ में कोई || = ऑपरेटर क्यों नहीं है?

शीर्षक देखें। यह प्रश्न सभी लॉजिकल + असाइनमेंट ऑपरेटरों को शामिल करने के लिए विस्तारित किया जा सकता है। स्पष्टीकरण के लिए: मैं | = ऑपरेटर के बारे में बात नहीं कर रहा हूं।

एक और उदाहरण: & & =

धन्यवाद।

उदाहरण:

 
bool result = false; 

// Today 
result = result || my_test1(); 
// Do stuff 
result = result || my_test2(); 

// In my imagination only... 
result ||= my_test1(); 
// Do stuff 
result ||= my_test2(); 
+0

ऐसे ऑपरेटर के लिए उपयोग का मामला वास्तव में क्या होगा? – RedX

+0

इस तरह के एक (शायद ही कभी, यदि आवश्यक हो) के लिए _are_ ऑपरेटरों का निर्माण। वाक्यविन्यास क्रमश: '| = !!' और '& = !!' है। चाहे वह कोड आप लिखना चाहते हैं, एक अलग सवाल है (हालांकि स्वीकार्य रूप से मैंने कम से कम '!!' मुहावरे पहले इस्तेमाल किया है, और लिनक्स कर्नेल स्रोतों में 'संभावित' मैक्रो भी इसका उपयोग करता है)। – Damon

+7

@ डैमन: '| = !! 'ऑपरेटर नहीं है, यह तीन ऑपरेटरों का संयोजन है:' | =! ! 'और'! 'की उच्च प्राथमिकता समस्याएं उत्पन्न करती है यदि आपके पास कम प्राथमिकता के साथ अभिव्यक्ति है, जैसे दाएं तरफ '+', ई। जी। 'एक्स | = !! 5 + x' आपको 'x | = 1 + x' देगा। – hirschhornsalz

उत्तर

13

एक अनुमान से कम, के रूप में वे केवल bools, जो पार्टी के लिए देर हो चुकी थी के लिए कोई मतलब होता

यहां तक ​​कि अगर bools इन ऑपरेटरों शुरू की होगी पर चारों ओर से किया गया था सीमित उपयोग, बिना दुष्प्रभाव के वे |= और &= के साथ बूलियन ऑपरेंड के समान होंगे, इसलिए एकमात्र उपयोग दुर्घटना से गैर-बूल को पार करने में फंस जाएगा।

यदि प्रस्तावित ऑपरेटरों भी शॉर्ट सर्किटिंग (|| और && के रूप में अनुचित नहीं हैं) तो आपके पास साइड इफेक्ट्स की उपस्थिति में उनके लिए अतिरिक्त औचित्य भी है।

एकमात्र अन्य संभावित कारण मैं उन्हें अनुमति देने के लिए सोच सकता हूं यदि यह भाषा को पार्सिंग/संकलित करने में काफी सरलता है, हालांकि संभवतः यह मामला नहीं है कि वे गैर-बूल प्रकारों के लिए समझ में नहीं आते हैं।

आखिरकार वे भाषा में नहीं हैं क्योंकि किसी ने भी उन्हें भाषा में रखने के लिए पर्याप्त देखभाल नहीं की है, इस प्रकार हम निष्कर्ष निकाल सकते हैं कि इनमें से कोई भी औचित्य प्रस्ताव प्रस्तुत करने की लागत को वारंट करने के लिए पर्याप्त नहीं है, इसे मानक में प्राप्त कर रहा है और सुविधा को कार्यान्वित करना

+7

"जैसा कि वे समान होंगे | = और & =" नहीं, वे वही नहीं होंगे। बूल ए = सच; एक || = somecomplexfuncReturningBoolAfterAnHour() – josefx

+0

"एकमात्र उपयोग दुर्घटना में गैर-बूल को गुजरने में फंस जाएगा" ... इसका तात्पर्य है कि उपयोग पर्याप्त औचित्य नहीं है, लेकिन आईएमएचओ यह पर्याप्त है। इसके अलावा, आप इस तथ्य को याद कर चुके हैं कि && और || शॉर्ट-सर्किट ऑपरेशंस हैं, और यदि भाषा शॉर्ट-सर्किट प्रदान की जाती है तो '|| =' और '&& =' वे संभावित रूप से अधिक कुशल होंगे - संभावित संभावित नल-पॉइंटर मुद्दों आदि के बावजूद उपयोग योग्य - '= =' और '& = 'एक ही कोड के लिए। –

+2

उभरा होगा, अगर उत्तर में केवल पहली वाक्य शामिल थी। '&& =' '&&': '3 और 4' के रूप में ज्यादा समझ में आता है, जबकि' 3 और 4' गलत है। – soulmerge

8

क्योंकि वे समझ में नहीं आएंगे। x op= y की परिभाषा x = x op y है, सिवाय इसके कि x केवल एक बार मूल्यांकन किया जाता है। इसका संक्षिप्त शॉर्ट सर्किट ऑपरेटर के साथ क्या मतलब है, जो अपने प्रत्येक ऑपरेंड को परिवर्तित करता है (यदि यह उनका मूल्यांकन करता है) bool पर?

if (!x) 
    x = y; 

जो निश्चित रूप से अन्य op= की व्याख्या से अलग है: ||= के बराबर की तरह कुछ हो सकता है।

+0

आपने व्यावहारिक रूप से अपना उद्घाटन कथन गिन लिया है! :-) बिल्टिन का शॉर्ट सर्किट ऑपरेशन एक उत्सुक अवलोकन है, और आपके प्रस्तावित समकक्ष ने मुझे निर्मित प्रकारों के लिए इंद्रियां दी हैं। उपयोगकर्ता द्वारा परिभाषित प्रकारों के लिए सी ++ व्यवहार को ध्यान में रखते हुए, आप स्पष्ट रूप से उपयोगकर्ता द्वारा परिभाषित 'ऑपरेटर && = (बूल rhs) अपेक्षा करते हैं कि शॉर्ट सर्किट न हो। यह सब एक अजीब अजीब है, लेकिन सी ++ अब क्या करता है इसे ध्यान में रखते हुए ... यदि भविष्य में सी ++ मानक के लिए प्रस्तावित किया गया था, तो मैं किसी को भी गंभीरता से यह नहीं कह सकता कि यह "समझ में नहीं आता"। –

+0

@ टोनी इसे प्रस्तावित करें, फिर। मेरा उद्घाटन कथन बहुत सामान्य हो सकता है: op= ऑपरेटरों पारंपरिक op= ऑपरेटरों के समान अर्थ नहीं बना सकते हैं; यदि हम शॉर्ट-सर्किटिंग को बनाए रखना चाहते हैं तो उनके लिए परिभाषा अलग होनी चाहिए। (दूसरी तरफ, उपयोगकर्ता परिभाषित '||' और '&& 'शॉर्ट सर्किट नहीं करता है, इसलिए इसे छोड़ने के लिए कुछ उदाहरण है। खराब उदाहरण, आईएमएचओ।) –

+1

मेरा तर्क (कोई फर्क नहीं पड़ता कि एक्स का मूल्यांकन एक बार किया जाता है * यदि संभव हो तो * या नहीं) चूंकि "a = a && b" पूरी तरह से सोचने योग्य और प्रयोग योग्य है, तो "a && = b" भी दिया जा सकता है; इस प्रकार मुझे लगता है कि यह सिर्फ इसलिए है क्योंकि वे "देर" हैं क्योंकि दूसरे उपयोगकर्ता ने उत्तर दिया था। – ShinTakezou

3

कोई अच्छा तार्किक कारण नहीं ... सुविधाओं के लिए केवल ऐतिहासिक दबाव।

लॉजिकल ऑपरेटर सामान्य रूप से सिंगल सीपीयू ऑपकोड के रूप में उपलब्ध नहीं होते हैं, इसलिए वे अपने बिटवाई समकक्षों के रूप में सस्ते या मौलिक नहीं होते हैं। एक लॉजिकल एक्सओआर भी अच्छा होगा, शायद ^^, फिर ^^=

फिर भी, ऑपरेटरों का प्रसार इसे बिल्ट-इन उपयोगकर्ता परिभाषित प्रकारों को बिल्टिन-स्टाइल सेमेन्टिक्स के साथ बनाने में तेजी से दर्दनाक बनाता है, और वहां वास्तविक वास्तविक दुनिया लाभ है। मैं अभी भी उन्हें देखना चाहूंगा - ये ऑपरेटरों रूबी की तरह कुछ अन्य भाषाओं में मौजूद हैं, और मैंने उन्हें सुविधाजनक और अभिव्यक्तिपूर्ण पाया है।

+1

+1 "कोई अच्छा तार्किक कारण नहीं है ..." मुझे सबसे तार्किक स्पष्टीकरण लगता है, हालांकि सीपीयू ऑपकोड पर वापस ट्रैकिंग मुझे पूरी तरह से विश्वास नहीं करती है (सीपीयू में "स्थिति पर सेट" हो सकता है और पूर्णांक पर बिटवाई ऑपरेटर हो सकते हैं केवल 1 या 0 लॉजिकल ऑपरेटरों की तरह व्यवहार करते हैं) – ShinTakezou

+0

@ShinTakezou: "शर्त पर सेट करें" पूर्णांक से बुलियन तक मैपिंग में सुविधा प्रदान कर सकता है, लेकिन यदि आपके पास पूर्णांक वाले दो रजिस्ट्रार या मेमोरी लोकेशन हैं और शर्तों को सेट करने के लिए पहले "परीक्षण" करने की आवश्यकता है फिर उस स्थिति का उपयोग "मानक" 0 बनाम 1 बूलियन मान उत्पन्न करने के लिए करें, फिर बिटवाई ऑपरेटर को लागू करें - आपके पास और कदम हैं। कुछ या 'rega, rega // सेट शर्तों के समान कुछ; set0ifz_1ifnz regA; 'इससे ​​पहले कि आप थोड़ा सा ऑपरेशन कर सकें। "Set0ifz_1ifnz" या तो एक एकल ऑपोड के रूप में उपलब्ध नहीं हो सकता है। –

+0

मैं सहमत हूं, लेकिन मुझे लगता है कि सीपीयू की इन "सीमाएं" आधुनिक भाषाओं के आजकल वाक्यविन्यास को प्रभावित नहीं कर सकती हैं, अगर कोई ऐसा वाक्यविन्यास रखने के लिए उपयोगी लगता है, निश्चित रूप से; संकलक तब उत्पादित कोड को बड़े पैमाने पर अनुकूलित कर सकते हैं, इससे कोई फर्क नहीं पड़ता कि स्रोत कैसा दिखता है (उदाहरण के लिए अन्य भाषाओं के "ए = ए + 1" के खिलाफ सी का "ए ++" एक ही कोड उत्पन्न कर सकता है) – ShinTakezou

3

क्योंकि उनके मोडस ऑपरंदी व्यापक रूप से भिन्न है। हस्ताक्षर में

देखो:

T operator+(T,T); 
T& T::operator+=(T); 

T operator*(T,T); 
T& T::operator*=(T); 

bool operator&&(T,T); 
??? 

यौगिकों ऑपरेटरों ऑपरेटरों कि तर्क के एक ही प्रकार वापसी के लिए मौजूद हैं, && और || ऑपरेटरों एक बूलियन वापसी (या कम से कम, होने की संभावना है), और इसलिए यह बूलियन केवल के अलावा, एक कंपाउंड संस्करण बनाने के लिए समझ में नहीं आता है।

+0

मैंने कभी कोशिश नहीं की है, लेकिन मुझे लगता है "फ्लोट ए और फ्लोटबी" में बहुत अधिक समझ नहीं है, हालांकि परिणाम औपचारिक रूप से एक फ्लोट सी हो सकता है; इसके अलावा विशेष रूप से सी में जहां कोई आदिम बूल प्रकार नहीं है, और हम इसके लिए एक int का उपयोग कर सकते हैं; इसलिए यदि "डबल ए और = फ्लोटबी" संभव है, तो भी मुझे लगता है कि "a && = b" होना चाहिए। – ShinTakezou

+0

"' &&, || और^'ऑपरेटर एक बूलियन लौटाते हैं "... नहीं,'^'थोड़ा सा ऑपरेटर है, यह सार्वभौमिक रूप से ज्ञात नहीं है क्योंकि उन्हें कुछ सफलता के साथ बूलियन पर लागू किया जा सकता है, हालांकि यह है जोखिम भरा। इसके अलावा, यह मानता है कि आप सी ++ ओवरलोडिंग के बारे में बात कर रहे हैं, लेकिन चर्चा नहीं करता है कि क्यों सी और सी ++ कंपाइलर्स वास्तविक बिल्टिन बूलियन के लिए उन परिचालनों को प्रदान नहीं करते हैं। –

+0

@ShinTakezou: 'बूल' नहीं है लेकिन हर किसी के पास 'बूल' टाइप किया गया है और शर्तों के लिए बूलियन संदर्भ की एक धारणा है @ टोनी: '^' के लिए दाएं, मैं फिसल गया। मैं ऑपरेटर ओवरलोडिंग के बारे में बात नहीं कर रहा था (वास्तव में नहीं), मुझे अंतर दिखाने के लिए हस्ताक्षर का पर्दाफाश करने की आवश्यकता थी। –

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