2011-07-01 20 views
5

मान लीजिए कि हमारे पास 3 चर हैं और हमें यह सुनिश्चित करने की आवश्यकता है कि वे या तो सभी बराबर -1 हो सकते हैं या न ही 1 के बराबर हो सकते हैं। मैंने निम्नलिखित कोड लिखा:ट्रिपल समानता अभिव्यक्ति मूल्यांकन

x := 1; 
y := 1; 
z := 1; 

ASSERT((x = -1) = (y = -1) = (z = -1)); 

मैं अक्सर इस तरह की जांच लिखता हूं, लेकिन दो चर के लिए। आश्चर्यजनक रूप से ट्रिपल तुलना भी संकलित, लेकिन यह उम्मीद के रूप में काम नहीं करता है। (1, 1, 1) मानों के लिए मैं उम्मीद करता हूं कि यह सत्य पर मूल्यांकन करे। चर मान और सरलीकरण के प्रतिस्थापन के बाद हम पाते हैं:

ASSERT(False = False = False); 

और मैंने सोचा कि यह सही पर मूल्यांकन करना चाहिए, लेकिन ऐसा नहीं है। तो यह ट्रिपल तुलना का मूल्यांकन कैसे किया जाता है?

+0

न तो? 3 स्थितियों के साथ यह कैसे संभव है? अभिव्यक्ति की अजीबता के लिए –

+0

+1! यदि आपके पास बूलियन मानों के अलावा कुछ और था तो आपको 'असंगत प्रकार' कंपाइलर त्रुटि मिल जाएगी; और मुझे लगता है कि यह एक कोने-केस है क्योंकि बुलेन मानों की शायद ही कभी '=' ऑपरेटर से तुलना की जाती है। –

+2

कुछ भी अजीब नहीं है, झूठी = झूठी सच के बराबर होती है, और सही <> झूठी –

उत्तर

8

सबसे पहले, = ऑपरेटर एक बाइनरी ऑपरेटर है: यह हमेशा मूल्यों की एक जोड़ी पर काम करता है। तो "ट्रिपल समानता" जैसी कोई चीज़ नहीं है। कंपाइलर एक जोड़ी का मूल्यांकन करेगा, और दूसरे का मूल्यांकन करने के लिए परिणाम का उपयोग करेगा।

जब कंपाइलर एकाधिक लिंक किए गए ऑपरेटरों को देखता है, तो उसे "ऑपरेटर की प्राथमिकता" कहलाते हुए जोड़ों में समूहित करने की आवश्यकता होती है। यह स्पष्ट है कि क्या आप प्राथमिक विद्यालय में सीखने वाले मूल अंकगणितीय ऑपरेटरों के बारे में सोचते हैं। इसमें कोई संदेह नहीं है कि: 3+2*4 का मूल्यांकन करता है: यह 3+(2*4) के बराबर है। संदेह में, हमेशा समूह को स्वयं जोड़ें। आप ऐसा करते हैं, तो आप देख अपने अभिव्यक्ति के बराबर है:

((False = False) = False), और यह करने के लिए मूल्यांकन करता है स्पष्ट है:

(True = False)

ASSERT(((x = -1) = (y = -1)) and ((y = -1) = (z = -1)))

तब मैं शायद या तो एकाधिक पंक्तियों में है कि अभिव्यक्ति लिखते हैं AND ऑपरेटर स्पष्ट बनाने के लिए (:

क्या आप शायद चाहते हैं AND ऑपरेटर और समूह अपने प्रारंभिक Assert इस तरह उपयोग करने के लिए है एसक्यूएल आदत, मुझे पता है), या यह पूरी तरह से फिर से लिखने:

Assert (
    ((x = -1) = (y = -1)) 
    and 
    ((x = -1) = (z = -1)) 
); 

या इस प्रकार:

Assert (
    ((x = -1) and (y = -1) and (z = -1)) 
    or 
    ((x <> -1) and (y <> -1) and (z <> -1)) 
); 

मेरा नियम है: यदि ऑपरेटर की प्राथमिकता को समझने के लिए 1 सेकंड अधिक होता है, तो ब्रांड्स जोड़ें।

+3

+1। –

2

तुलना साहचर्य है: झूठी = झूठी = झूठी को (झूठी = false) बराबर है झूठी =। पहले झूठी = झूठीसच का मूल्यांकन, तुलना के लिए अग्रणी सच है = झूठी जो बारी में झूठी है।

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