2017-01-25 16 views
30

आप इस तरह कुछ करने के लिए प्रयास करते हैं:क्यों (बूलियन^int> 0) काम करता है?

if (true^1) { 
    //do something 
} 

संकलक यथोचित का कहना है कि ऑपरेटर ^ तर्क प्रकारों बूलियन और पूर्णांक के लिए परिभाषित नहीं है। लेकिन अगर आप इस तरह इसका इस्तेमाल:

if (true^1 > 0) { 
    //do something 
} 

कोड compiles (जावा 8 के लिए कम से कम) और दोषरहित काम करता है। असल में इन आपरेशनों:

false^-1 > 0 
false^1 > 0 
true^-1 > 0 
true^1 > 0 

अधिनियम एक वैध तार्किक XOR की तरह:

 |^
-----+-- 
F F | F 
F T | T 
T F | T 
T T | F 

किसी को भी कृपया समझा सकते हैं क्या हुड के नीचे होता है?

+32

के साथ XORed बूलियन नहीं कर सकते हैं, मैं आपको [* ऑपरेटर प्राथमिकता *] के बारे में जानने की सलाह देता हूं (http://introcs.cs.princeton.edu/java/11precedence/)। –

+5

@ सोप्रप्रोग्रामड्यूड निष्पक्ष होने के लिए, तथ्य यह है कि तुलनात्मक रूप से बिटवाई ऑपरेटरों की तुलना में कम प्राथमिकता है, जहां यह मामला है, ऑपरेटर की प्राथमिकता का एक विशेष रूप से अनजान पहलू है। – Random832

+5

यही कारण है कि आपको इसके बारे में जानने की आवश्यकता है, @random :-) –

उत्तर

78

यह आसान है XOR।

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

+3

मुझे कभी नहीं मिला कि जावा और सी # जैसी सुरक्षा उन्मुख भाषाएं स्पष्टता के लिए कोष्ठक की आवश्यकता के बजाय ऐसे कोड की अनुमति क्यों देती हैं। आखिरकार, कोई नियम नहीं है कि ऑपरेटर प्राथमिकता कुल आदेश होना चाहिए। – CodesInChaos

+2

@CodesInChaos: अच्छी तरह से प्रगति + सहयोगीता किसी भी अभिव्यक्ति के लिए व्यवहार को अच्छी तरह से परिभाषित करती है। मुझे यकीन नहीं है कि क्या आपका मतलब "कुल आदेश" से है या नहीं ... –

+3

@CodesInChaos मुझे लगता है कि जवाब यह है कि 'सुरक्षा' उन्मुख हैं और 'स्पष्टता' उन्मुख नहीं हैं। ये संबंधित हैं लेकिन विशिष्ट हैं। सुरक्षा के लिए आवश्यक है कि कोई अस्पष्टता न हो और यह निश्चित रूप से स्पष्ट नहीं है। हालांकि स्पष्टता उन्मुख भाषा का विचार दिलचस्प है। मैंने कभी ऐसा कुछ नहीं किया है जो सिंटैक्स _purely_ प्रतिबंधित है क्योंकि इसे समझना मुश्किल हो सकता है। यह अजीब तरह का है क्योंकि स्पष्टता को व्यापक विकास के इस तरह के मौलिक पहलू के रूप में व्यापक रूप से माना जाता है। – JimmyJames

10

1 प्रकार int है।

1> 0 प्रकार बूलियन है।

^का अर्थ है एक्सओआर; और आप एक्सओआर बूलियन और int नहीं कर सकते हैं।

दूसरे शब्दों में: पहली अभिव्यक्ति "1" एक संख्या का मूल्यांकन करती है; दूसरी अभिव्यक्ति "1> 0" बुलियन तर्क का मूल्यांकन करती है। इसके पीछे कारण ऑपरेटर predecence है। >precedence से ^ अधिक है, इसलिए

if (true^1 > 0) { 

if (true^(1 > 0)) { 

जो

if (true^true) 

के बराबर है के बराबर है ... जो सिर्फ तार्किक है:

11

क्योंकि ऑपरेशन >^ से अधिक प्राथमिकता है, इसलिए यह true^(1>0) के बराबर है जो एक ही प्रकार (बूलियन^बूलियन) के साथ काम कर रहा है।

+0

[यह "से" है, न कि "तब"] (http://www.wikihow.com/Use-Than-and-hen) (इस संदर्भ में)। –

3

चूंकि आदेश (प्राथमिकता) के संचालन के लिए महत्वपूर्ण है, > से ^

यहाँ उच्च प्राथमिकता है, पहले हम 1 > 0 जाँच और फिर पहला ऑपरेशन XORed (^) पहला परिणाम

साथ है if(true^(1 > 0)) के बराबर है

लेकिन, निश्चित रूप से आप int

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