2010-07-27 13 views
9

ये ऑपरेशन सरल हो सकते हैं लेकिन स्पष्टीकरण ढूंढने में कठिनाई जो निश्चित और पूर्ण हैं, ने मुझे पूछने के लिए प्रेरित किया। एक ऑपरेंड युक्त वर्ण संयोजन क्या होते हैं जिसके बाद बराबर चिह्न (जैसे * =, - =, + =, आदि), वे क्या करते हैं और वे कैसे उपयोगी होते हैं (विशेष रूप से गैर-संख्यात्मक फ़ील्ड से संबंधित)?प्रतीकों का उपयोग कैसे करें + =, * =, - =

उदाहरणों के साथ-साथ परिभाषाओं की भी सराहना की जाएगी।

x += y; 
अधिक वर्बोज़ के बजाय

:

x = x + y; 

कभी कभी यह है, जब तार के साथ काम अच्छा है के रूप में आप कर सकते हैं

धन्यवाद

+3

और विकिपीडिया मदद नहीं करता है? http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B –

+0

ये ऑपरेटर कई भाषाओं में दिखाई देते हैं, लेकिन कृपया इसके बारे में पूछने के लिए केवल एक चुनें ताकि हम बेहतर उत्तर दे सकें और टैग स्पैम से बच सकें। – danben

+0

कोई भी और यह जानकारी विकिपीडिया या अन्य संदर्भ साइटों पर आसानी से पाई जा सकती है। – James

उत्तर

2

बड़ा फायदा है कि आप कह सकते हैं है किसी मौजूदा स्ट्रिंग में टेक्स्ट जोड़ने के लिए += का उपयोग करें।

+3

बस एक नोट, कि स्ट्रिंग पर '+ =' का उपयोग करके टालना चाहिए यदि समेकित करने के लिए कई स्ट्रिंग हैं , क्योंकि आवंटन व्यवहार बहुत अक्षम है। – Dathan

+1

बिल्कुल। सी # के मामले में, एक स्ट्रिंगबिल्डर अधिक उपयुक्त होगा। –

1

कहें कि आपके पास x = 5 है। आप एक्स के लिए 1 जोड़ना चाहते हैं, तो आप यह कई मायनों में कर सकते हैं:

x = x + 1; x += 1; x++; ++x;

वे सब बराबर कर रहे हैं, और उन में से किसी 6.

साथ x छोड़ देना चाहिए चुनकर

तो मूल रूप से, यदि आप x से गुणा करना, विभाजित करना या घटाना चाहते हैं, तो बस + ऑपरेटर को अपनी इच्छित चीज़ों में बदलें।


क्षमा करें, मैंने नहीं देखा कि आपने गैर-संख्यात्मक फ़ील्ड का उल्लेख किया है। सी # और सी ++ में, आप गैर-न्यूमेरिक ऑब्जेक्ट को उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन और/या तुलना के साथ इन यौगिक ऑपरेटरों का उपयोग करने की क्षमता देने के लिए "ऑपरेटर ओवरलोड" नामक कुछ कर सकते हैं।

उदाहरण के लिए, तार आम तौर पर वस्तुओं के रूप में इलाज कर रहे हैं और नहीं के रूप में आदिम डेटा प्रकार, लेकिन अगर आप String s = "hello"; s += "!"; निष्पादित, आप देखेंगे कि shello! शामिल होंगे। ऐसा इसलिए है क्योंकि स्ट्रिंग ऑब्जेक्ट के लिए एक अतिभारित ऑपरेटर है है + एक rvalue (+ = ऑपरेटर की "!" --right) lvalue (+ = ऑपरेटर की "hello" --left) के साथ संलग्न लागू होने वाला = ।

सी # ऑपरेटर ओवरलोडिंग पर इससे संबंधित एक सवाल: Simple way to overload compound assignment operator in C#?

+3

यह ध्यान रखना महत्वपूर्ण है कि x ++ और ++ x अलग-अलग हैं, खासकर लूप के संदर्भ में। – TreDubZedd

+0

x ++ और ++ x बराबर नहीं है हालांकि अंततः वही प्रभाव होने वाला अंत होगा। वैकल्पिक उपयोगों का उल्लेख करने के लिए –

11

वे आमतौर पर के रूप में व्याख्या कर रहे हैं:

x += y === x = x + y 

(आदि ऑपरेटर की अपनी पसंद के लिए)

तथापि; कुछ भाषाएं आपको एक bespoke + = ऑपरेटर * रखने की अनुमति देती हैं, या कुछ परिदृश्यों में इसे अलग-अलग समझ सकती हैं; उदाहरण के लिए, सी # घटनाओं में, + = और - = मतलब "एड एक्सेसर के माध्यम से सदस्यता लें" और "हटाए गए एक्सेसर के माध्यम से सदस्यता रद्द करें" क्रमशः।

आमतौर वे सिर्फ अंतरिक्ष सेवर हैं, लेकिन कुछ मामलों में अर्थ मतभेद हो सकता है।


* = मैं कहाँ मतलब है: बहुत अलग करने के लिए सिर्फ + ऑपरेटर और असाइनमेंट

+0

+1। –

1

ये यौगिक काम ऑपरेटरों रहे हैं। संख्यात्मक क्षेत्रों के लिए, उन्हें जोड़ने के लिए परिभाषित किया गया है (+=), गुणा (*=) गुणा करें, और बाएं तरफ चर से दाएं मूल्य पर दाएं (-=) घटाएं, और बाएं तरफ चर को परिणाम दें।

हालांकि, सी ++ "ऑपरेटर ओवरलोडिंग" का समर्थन करता है। मतलब, किसी दिए गए ऑब्जेक्ट के लिए, प्रोग्रामर परिभाषित कर सकता है कि क्या होता है यदि आप x += 12 और x लिखते हैं तो के बजाय Foo का ऑब्जेक्ट होता है। यह आमतौर पर स्ट्रिंग कक्षाओं के लिए किया जाता है, इसलिए यदि s1 = "All this" आप s1 += " and more" लिख सकते हैं और परिणाम "All this and more" होगा।

0

गैर-संख्यात्मक फ़ील्ड के संबंध में: ऑपरेटर क्या पूरी तरह से मनमाना करते हैं। सी/++/# में, आप ओवरराइड कर सकते हैं क्या एक ऑपरेटर करता है, आप की तरह कुछ लिखने के लिए अनुमति देता है:

MyObj += MyOtherObj; 
// MyObj is now null 

जब ऑपरेटरों अधिक भार, तुम सच में जो कुछ भी आप की तरह कर सकते हैं।

2

x += expression लगभग x = x + (expression) जैसा ही है। दूसरे शब्दों में, यह दाएं हाथ की तरफ की गणना करता है, फिर बाएं हाथ की ओर और ऑपरेटर को + ऑपरेटर लागू करता है, और उसके बाद उस परिणाम को बाएं हाथ में वापस सौंपता है।

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

हालांकि, बाएं हाथ की तरफ बहुत बड़ा होने पर वे काफी आसान होते हैं, इसलिए दोहराने से यह ज्ञान से अधिक शोर फेंक देगा।

1

आप एक स्पष्टीकरण http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Compound-assignment_operators पढ़ने की तरह कोई पहले से ही सुझाव दिया की कोशिश चाहते हैं, मूल रूप से a += b;a = a + b; के बराबर है। अपने कोड को लिखने और पढ़ने के लिए आसान बनाने के लिए यह शॉर्टेंड है।

/* Print all evens from 0 through 20 */ 
for(i = 0; i <= 20; i += 2){ 
    printf("%d\n", i); 
} 

/* Slow down at a linear pace */ 
/* Stop after speed is 0.1 or less */ 
while(speed > 0.1){ 
    speed /= 1.2; 
} 
speed = 0; 

उन समझा जाना चाहिए:

कुछ उदाहरण हैं। यह bitwise संचालन के साथ ही अंकगणित पर लागू होता है, लेकिन मैं अपने सिर के ऊपर से किसी भी सरल उपयोग के बारे में नहीं सोच सकता और मैं आपको भ्रमित नहीं करना चाहता। पुरानी अस्थायी-कम स्वैप चाल है - a ^= b ^= a ^= b; - जो अस्थायी चर बनाने के बिना ए और बी के मानों को स्वैप करेगा, लेकिन मुझे यकीन नहीं है कि क्या आपको पता है कि इस बिंदु पर बिटवाई एक्सओआर ऑपरेशन क्या है, इसलिए डॉन अभी तक इसे पढ़ा नहीं है।

11

बहुत सारे उत्तर यहां बताते हैं कि x + = y; "x = x + y;" के बराबर "समतुल्य" है।

यह वास्तव में सच नहीं है।वे कई कारणों से बिल्कुल समान नहीं हैं।

पहला, दुष्प्रभाव केवल एक बार किया जाता है। मान लें कि आपके पास

class C { public string S { get; set; } } 
class D 
{ 
    private static C c = new C(); 
    static C M() 
    { 
     Console.WriteLine("hello!"); 
     return c; 
    } 
} 

नीचे दी गई पहली पंक्ति "हैलो" प्रिंट करता है, जैसा कि आप उम्मीद करेंगे। दूसरा दो बार प्रिंट करता है।

D.M().S += "abc"; 
D.M().S = D.M().S + "abc"; 

दूसरा, टाइप सिस्टम नियमित असाइनमेंट के मुकाबले यौगिक असाइनमेंट के लिए अलग-अलग काम करता है।

short b = 1; 
short c = 2; 
b += c; 
b = b + c; 

तीसरी पंक्ति कानूनी है। चौथी रेखा नहीं है; एक छोटा सा प्लस एक छोटा सा सी # में int है, इसलिए बी = बी + सी एक छोटा सा अंतर्निहित असाइनमेंट है। इस मामले में यौगिक असाइनमेंट वास्तव में बी = (लघु) (बी + सी) के बराबर है;

यदि यह विषय आपको रूचि देता है तो मैं आपको सी # विनिर्देश के अनुभाग 7.17.2 और 7.17.3 पढ़ने के लिए प्रोत्साहित करता हूं।

+0

"दुष्प्रभाव केवल एक बार किया जाता है"। ऐसा क्यों है (इसके अलावा यह spec में लिखा गया है)? क्या यह एक डिजाइन दोष नहीं है? इस वजह से, कक्षाओं को अधिभारित किया जा सकता है, कुछ परिस्थितियों में '+ =' के संयोजन के साथ उपयोग नहीं किया जा सकता है? लेकिन कक्षा के लेखक को उपयोगकर्ता को ऐसा करने से रोकने का कोई तरीका नहीं है ... इसलिए, यदि + = + समान नहीं है, तो हमें कम से कम इसे (आंशिक रूप से) अधिभारित करने का मौका मिलना चाहिए। – user492238

+0

@ user492238: नहीं, यह एक डिज़ाइन दोष नहीं है। मुझे लगता है कि ज्यादातर उपयोगकर्ता उम्मीद करेंगे कि GetDatabaseRecord()। TotalPrice + = newTaxes; केवल GetDatabaseRecord * एक बार * कॉल करता है। यह दो बार कॉल करने के लिए एक डिजाइन दोष होगा। –

+0

@ user492238: आपके दूसरे प्रश्न के लिए, मुझे यह समझ में नहीं आता है। क्या आप उदाहरण दे सकते हैं कि x = x + y और x + = y में अलग-अलग अर्थशास्त्र होना चाहिए? मैं कहूंगा कि नियमित प्रकार और यौगिक असाइनमेंट अतिरिक्त के बीच एक अंतर है जिसमें कुछ डिज़ाइन समस्याएं हैं। यह मेरे लिए बहुत आश्चर्यजनक होगा। –

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