2009-09-04 41 views

उत्तर

82

एकल ampersand & तार्किक और ऑपरेटर है। डबल ampersand & & फिर से एक तार्किक और ऑपरेटर है जो शॉर्ट-सर्किटिंग व्यवहार को नियुक्त करता है। लघु सर्किटिंग अर्थ केवल यह है केवल जब परिणाम पूरी तरह से पहले संकार्य (बाएं हाथ की ओर)

एक & बी (ए और बी मूल्यांकन किया जाता है)

द्वारा निर्धारित नहीं है दूसरे संकार्य (दाहिने हाथ की ओर) मूल्यांकन किया जाता है & & बी (बी केवल मूल्यांकन किया जाता है यदि ए सत्य है)

+56

चेतावनी पर: '&' सरणी पर काम कर सकता है लेकिन '&&' केवल स्केलर पर ही काम कर सकता है। – gnovice

+0

साइड नोट: मैटलैब के साथ काम करने के 15 साल बाद लगभग हर दिन मैं हमेशा 'और' का उपयोग करता हूं और उसने कभी मुझे गधे में काट नहीं दिया है। ओटीओएच, मैं कई लोगों को जानता हूं जो '&&' का उपयोग करके नाराज हो जाते हैं क्योंकि उन्हें याद रखना है कि यह सार्वभौमिक नहीं है (हाँ मुझे एहसास है कि 'और' उतना कुशल नहीं है क्योंकि यह शॉर्ट सर्किट नहीं करता है लेकिन मैं काफी ज्यादा डेज़ी नहीं करता हूं- मेरे ऑपरेटरों को चेन करें ताकि बचत आजकल नगण्य हो)। – neuronet

+0

@neuronet यह वास्तव में दक्षता के बारे में नहीं है, और यह कि वह उस निर्माण की अनुमति देता है जहां पहली अभिव्यक्ति ऐसी स्थिति की गारंटी देती है जिसके बिना दूसरी अभिव्यक्ति रन-टाइम त्रुटि उत्पन्न कर सकती है। जैसे 'डी! = 0 और 1/डी' बनाम डी! = 0 और 1/डी' - पहली गारंटी शून्य से कोई विभाजन नहीं है, दूसरा नहीं है। – Fraser

8

दोनों तार्किक और संचालन हैं। & & हालांकि, एक "शॉर्ट-सर्किट" ऑपरेटर है। MATLAB दस्तावेज़ों से:

वे शॉर्ट-सर्किट ऑपरेटरों हैं कि वे केवल दूसरे ऑपरेंड का मूल्यांकन करते हैं जब परिणाम पहले ऑपरेंड द्वारा पूरी तरह से निर्धारित नहीं होता है।

और देखें here

3

& & और || short circuit ऑपरेटर स्केलर्स पर चल रहे हैं। & और | हमेशा दोनों ऑपरेटरों का मूल्यांकन करें और सरणी पर काम करें।

5

अन्य भाषाओं की तरह, '' एक तार्किक बिटवाई ऑपरेटर है, जबकि '& &' एक तार्किक ऑपरेशन है।

उदाहरण के लिए (क्षमा करें मेरे वाक्यविन्यास)।

तो एक = [यह सच है यह सच है झूठा सच] बी = झूठी

एक & बी = [झूठी झूठी झूठी झूठी]

..or अगर बी = सच एक & बी = [यह सच है यह सच है झूठा सच]

'& &' के लिए, दायां ऑपरेंड केवल तभी गणना की जाती है जब बाएं ऑपरेंड सत्य है, और परिणाम एक एकल बूलियन मान है।

एक्स = (ख ~ = 0) & & (एक/b> 18,5)

आशा है कि स्पष्ट है।

11

जैसा कि पहले ही दूसरों के द्वारा उल्लेख किया है, & एक logical AND operator और && एक short-circuit AND operator है।वे कैसे ऑपरेंड मूल्यांकन किया जाता है में भी है या नहीं, वे सरणियों या scalars पर काम लेकर मतभेद हैं:

  • & (AND ऑपरेटर) और | (OR ऑपरेटर) एक तत्व-में सरणियों पर काम कर सकते हैं बुद्धिमान फैशन।
  • && और || शॉर्ट सर्किट संस्करण हैं जिसके लिए दूसरा ऑपरेंड केवल तभी मूल्यांकन किया जाता है जब परिणाम पहले ऑपरेंड द्वारा पूरी तरह से निर्धारित नहीं होता है। ये केवल स्केलर पर संचालित हो सकते हैं, सरणी नहीं।
24

&& और || हमेशा स्केलर इनपुट और शॉर्ट-सर्किट लें। | और & केवल/समय बयानों में सरणी इनपुट और शॉर्ट-सर्किट लें। असाइनमेंट के लिए, उत्तरार्द्ध शॉर्ट-सर्किट नहीं करता है।

अधिक जानकारी के लिए these doc pages देखें।

+0

क्या आपके पास कोई जानकारी है जिस पर Matlab संस्करण शॉर्टकट '&' और '|' बयान में/कथन में है? यह R2012b और R2014a में ऐसा प्रतीत नहीं होता है। – Tim

+0

@ किसी भी विचार के बारे में * क्यों * उन्होंने केवल स्केलर्स के साथ काम करने के लिए डिज़ाइन किया? यह अजीब लगता है ... – neuronet

2

अंगूठे का एक अच्छा नियम है जब सशर्त बयान में उपयोग के लिए तर्क का निर्माण (अगर, आदि) हमेशा का उपयोग है & &/|| रूपों, जब तक कि एक बहुत अच्छा कारण नहीं है। इसके दो कारण ... हैं

  1. दूसरों के रूप में उल्लेख किया है, & & से कम-सर्किटिंग व्यवहार/|| अधिकांश सी जैसी भाषाओं के समान है। उस समानता/परिचितता को आम तौर पर इसके पक्ष में एक बिंदु माना जाता है।
  2. & & या || फॉर्म बलों को वेक्टर तर्कों के लिए अपना इरादा तय करने के लिए पूर्ण कोड लिखने के लिए। जब एक = [1 0 0 1] और बी = [0 1 0 1], & बी सच या गलत है? मुझे MATLAB के & के नियम याद नहीं हैं, क्या आप कर सकते हैं? ज्यादातर लोग नहीं कर सकते हैं। दूसरी ओर, यदि आप & & या || का उपयोग करते हैं, तो आपको स्थिति को हल करने के लिए "पूर्ण में" कोड लिखने के लिए मजबूर किया जाता है।

ऐसा करने से, बल्कि & और में वैक्टर की MATLAB के संकल्प पर निर्भर रहने के |, कोड थोड़ा और अधिक वर्बोज़ है कि की ओर जाता है, लेकिन एक बहुत सुरक्षित है और बनाए रखने के लिए आसान।

+1

+1, लेकिन यह ध्यान दिया जाना चाहिए कि आपका उत्तर केवल उन मामलों पर लागू होता है जहां आप ** चाहते हैं ** ऑपरेशन का अंतिम परिणाम स्केलर होने के लिए।& & | के लिए कई उपयोग हैं कहां && और || बेकार हैं क्योंकि वे सरणी वापस नहीं कर सकते हैं, उदाहरण के लिए जब फैंसी इंडेक्सिंग करते हैं जैसे "1 और 2 के बीच सभी आर का चयन करना: 'आर ((आर <2) और (आर <2))"। –

+0

अच्छा बिंदु, जोनास। जब मैंने यह लिखा था, तो मैं सशर्त के बारे में सोच रहा था, "लॉजिकल इंडेक्सिंग" नहीं, "आपके द्वारा वर्णित" फैंसी इंडेक्सिंग "के लिए MATLAB शब्द)। मैंने इसे प्रतिबिंबित करने के लिए अपनी पोस्ट की पहली वाक्य बदल दी। याद दिलाने के लिए शुक्रिया! –

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