2011-08-07 14 views
40

मैं somewhere किसी और को देखा कहा,"x && foo()" क्या है?

x && foo();

को

if(x){ 
    foo(); 
} 

मैं इसे परीक्षण किया है और वे वास्तव में ऐसा ही किया था बराबर है।
लेकिन क्यों? x && foo() क्या है?

+28

हालांकि यह एक हल्की चाल है, मुझे उम्मीद है कि आप इसका उपयोग नहीं करेंगे। यह काम करता है लेकिन इसे खराब रूप माना जाता है। –

+4

हाँ, मैं @ पोर्टेबलवर्ल्ड से सहमत हूं। 'अगर (x) {foo();}' या यहां तक ​​कि 'if (x) foo();' एक पंक्ति पर, समझदार, अधिक सामान्य उपयोग के बारे में होगा। – Kzqai

+4

लेकिन सावधान रहें कि इसे 'if (x && foo()) {...}' के साथ भ्रमित न करें जो स्वीकार्य है और इसका एक अलग अर्थ है। मैं, एक के लिए, 'x && foo()' पर ध्यान न दें, विशेष रूप से यदि इस तरह की चीजें बहुत रेंगती हैं ... कम से कम जेएस लाभ। – vol7ron

उत्तर

64

दोनों AND और OR ऑपरेटर शॉर्टकट कर सकते हैं।

तो && केवल दूसरी अभिव्यक्ति की कोशिश करता है यदि पहला सत्य है (सत्य की तरह, अधिक विशेष रूप से)। तथ्य यह है कि दूसरा ऑपरेशन सामान करता है (जो भी foo() करता है) इससे कोई फर्क नहीं पड़ता क्योंकि यह निष्पादित नहीं किया गया है जब तक कि पहली अभिव्यक्ति कुछ सत्य के लिए मूल्यांकन करती है। यदि यह सत्य है, तो को दूसरे परीक्षण की कोशिश करने के लिए निष्पादित किया जाएगा।

इसके विपरीत, यदि || कथन में पहली अभिव्यक्ति सत्य है, तो दूसरा स्पर्श नहीं होता है। ऐसा इसलिए किया जाता है क्योंकि पूरे कथन का मूल्यांकन पहले से ही किया जा सकता है, दूसरी अभिव्यक्ति के नतीजे के बावजूद बयान सही होगा, इसलिए इसे अनदेखा कर दिया जाएगा और अप्रत्याशित रहेगा।

इस तरह शॉर्टकट का उपयोग करते समय देखने के लिए मामले, ऑपरेटर के साथ मामले हैं जहां परिभाषित चर अभी भी झूठी मानों (जैसे 0) का मूल्यांकन करते हैं, और सच्चे वाले (उदा। 'zero')।

+3

यह सुनिश्चित करने के लिए कि आपकी भाषा एक ही शॉर्टकट निष्पादन समाप्ति नियम का पालन करती है, अपनी भाषा के सिंटैक्स विनिर्देश की जांच करें। विरासत भाषाएं मौजूद हैं जो इसका उल्लंघन करती हैं। –

+0

असल में, डेल्फी में आप इसे पूरी परियोजना, एक विशिष्ट फ़ाइल, या यहां तक ​​कि एक निश्चित समारोह के लिए भी बंद कर सकते हैं .. पागल सामान :) http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN /html/devcommon/compdirsbooleanshortcircuitevaluation_xml.html –

+5

@ जॉन: प्रश्न जावास्क्रिप्ट निर्दिष्ट करता है ... –

3

जावास्क्रिप्ट में, && ऑपरेटर बाएं से दाएं का मूल्यांकन करता है और दाएं ऑपरेशन का मान देता है। यदि पहली स्थिति गलत होने का मूल्यांकन करती है, तो यह दूसरे का मूल्यांकन नहीं करती है। तो कह रही है की अपनी एक आशुलिपि

24

यह short-circuit evaluation के रूप में जाना जाता है "अगर कुछ अशक्त या अपरिभाषित नहीं है, कुछ करते हैं"।

इस मामले में, यदि x गलत है, तो foo() का मूल्यांकन करने की आवश्यकता नहीं है (&& का परिणाम हमेशा गलत होगा); यदि x सत्य है, तो इसका मूल्यांकन करने की आवश्यकता है (भले ही परिणाम फेंक दिया गया हो)।

+0

आह, विकिपीडिया लेख निश्चित रूप से इसे सभी को शामिल करता है। हमेशा की तरह। – Kzqai

+4

@Tchalvak: यह करता है ... अगर आपको पता है कि क्या देखना है! – Johnsyweb

2

यह छोटा सर्किटिंग है।

&& ऑपरेटर इस तरह काम करता है: यह दोनों तरफ तार्किक या दो ऑपरेंड करता है। यदि बाएं हाथ की ओर शून्य शून्य मान है तो सही मूल्य निर्धारित करने के लिए दाईं ओर की ओर मूल्यांकन किया जाता है। यदि बाएं हाथ की तरफ शून्य है तो जो भी दायां हाथ हो, अभिव्यक्ति 0 का मूल्यांकन करेगी, इसलिए दाएं हाथ की ओर मूल्यांकन नहीं किया गया है। तो असल में, यदि x गैर-शून्य है तो केवल foo कहा जाता है, और यदि x 0 है तो foo नहीं कहा जाता है, और इस प्रकार, यह इस मामले में if - else जैसा काम करता है।

8

यह बिल्कुल समकक्ष नहीं है। पहला एक रिटर्न वैल्यू वाला अभिव्यक्ति है जिसका आप उपयोग कर सकते हैं; दूसरा एक बयान है।

आप वापसी मान में रुचि (जो जानकारी है x और foo() दोनों एक truthy मूल्य के रूप में मूल्यांकित किया या नहीं), वे बराबर हैं, लेकिन आम तौर पर, आप बूलियन-तर्क संस्करण केवल अगर आप चाहते हैं का उपयोग करना चाहिए नहीं कर रहे हैं एक बूलियन अभिव्यक्ति, जैसे के रूप में उपयोग करने के लिए:

if (x && foo()) { 
    do_stuff(); 
} 

आप केवल foo() सशर्त चल रहा में रुचि रखते हैं (जब एक्स truthy है), दूसरा रूप पसंद किया जा करने के लिए है, क्योंकि यह अधिक स्पष्ट रूप से बता देते हैं इरादा है।

लोगों को बूलियन-तर्क संस्करण पसंद हो सकता है कि जावास्क्रिप्ट असामान्य प्रतिबंध के अधीन हो सकता है: स्रोत कोड आकार (अधिक वर्बोज़ स्रोत कोड का अर्थ है बैंडविड्थ का उपयोग); चूंकि बुलियन-तर्क संस्करण कम वर्णों का उपयोग करता है, इसलिए यह अधिक बैंडविड्थ-कुशल है। मैं अब भी अधिकतर वर्बोज़ संस्करण को अधिक पसंद करूंगा, जब तक कि प्रश्न में लिपि का उपयोग बहुत कुछ नहीं किया जाता - जब तक कि jQuery जैसी लाइब्रेरी के लिए, इस तरह के अनुकूलन का उपयोग पूरी तरह से उचित नहीं है, लेकिन अधिकांश मामलों में यह नहीं है।

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