2010-10-12 6 views
8

संभव डुप्लिकेट:
Why is this statement not working in java x ^= y ^= x ^= y;क्यों xor के साथ स्वैप C++ में ठीक काम करता है लेकिन जावा में नहीं है? कुछ पहेली

नमूना कोड

int a=3; 
int b=4; 
a^=(b^=(a^=b)); 

सी ++ में यह चर अदला-बदली, लेकिन जावा में हम एक = 0, बी मिलता है = 4 क्यों ?

+0

इस तरह के एक उच्च स्तर पर बचा जाना चाहिए: http://en.wikipedia.org/wiki/XOR_swap_algorithm#Reasons_for_avoidance_in_practice – JoshD

उत्तर

16

एक बयान में आपके सभी स्वैप लेखन, आप बाहरी a^=(...) अभिव्यक्ति के भीतरी a^=b अभिव्यक्ति रिश्तेदार के साइड इफेक्ट पर निर्भर हो रहे हैं। आपका जावा और सी ++ कंपाइलर्स चीजें अलग-अलग कर रहे हैं।

आदेश XOR स्वैप ठीक से करने के लिए, आप कम से कम दो बयानों का उपयोग करना पड़:

a ^= b; 
a ^= (b ^= a); 

हालांकि, चर स्वैप करने के लिए सबसे अच्छा तरीका है कि यह एक अस्थायी चर के साथ सांसारिक तरीके से करना है, और संकलक का सबसे अच्छा तरीका चयन करने देने के लिए वास्तव में यह कार्य करें:

int t = a; 
a = b; 
b = t; 

सबसे अच्छा मामले में, संकलक उत्पन्न होगा ऊपर अदला-बदली के लिए सभी में कोई कोड, और बस रजिस्टरों किपकड़ इलाज शुरू कर देंगेऔर b दूसरी तरफ। आप कोई भी मुश्किल xor कोड नहीं लिख सकते जो बिल्कुल कोई कोड नहीं धड़कता है।

+2

ध्यान दें कि "एक्सओआर स्वैप ठीक से कर रहा है" किनारे के मामले में काम नहीं करता है कि 'a' और' b' समान चर हैं। परिवर्तनीय स्वैप करने के लिए –

+2

+1 अधिक वैचारिक तरीके से +1। – Gorgen

+0

बहुत बहुत धन्यवाद ... –

7

यह सी ++ में काम करने की गारंटी नहीं है। यह अपरिभाषित व्यवहार है।

आप तीन अलग-अलग बयानों में यह करना चाहिए:

a ^= b; 
b ^= a; 
a ^= b; 
+0

कारण यह है कि नहीं-सख्ती से दो अनुक्रम अंक के बीच बोल (जैसे एक;) एक चर नहीं हो सकता एक से अधिक बार बदलें, न कि अपरिभाषित व्यवहार –

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