5

सी # में यह गारंटी है कि अभिव्यक्तियों का मूल्यांकन बाएं से दाएं किया जाता है?बाएं से दाएं अभिव्यक्ति मूल्यांकन

उदाहरण के लिए:

myClass = GetClass(); 
if (myClass == null || myClass.Property > 0) 
    continue; 

वहाँ रहे हैं किसी भी भाषा कि अनुपालन नहीं करते?

उत्तर

14

आप वास्तव नामक एक भाषा सुविधा का उल्लेख "शॉर्ट-सर्किट तार्किक अभिव्यक्ति":

क्या इसका मतलब यह है: एक तार्किक अभिव्यक्ति के परिणाम अब और नहीं बदल सकते है, जैसे जब यह स्पष्ट हो जाता है कि अभिव्यक्ति "सत्य" या "झूठी" का मूल्यांकन करेगी, इससे कोई फर्क नहीं पड़ता कि अभिव्यक्ति के शेष हिस्सों का मूल्यांकन नहीं किया जाएगा।

उदाहरण के लिए, सी #, जावा या जावास्क्रिप्ट ऐसा करते हैं, और आप उन भाषाओं में (अपने प्रश्न का उत्तर देने के लिए) पर भरोसा कर सकते हैं।

आपके मामले में, अगर MyClass अशक्त नहीं है:

  • MyClass == null झूठी
  • का आकलन करती है, क्योंकि यह एक "या" अभिव्यक्ति है, दूसरे भाग अभी भी परिणाम को बदल सकते हैं, तो यह
  • मूल्यांकन किया जाता
  • myClass.Property > 0 निर्धारित करता है अंतिम परिणाम

अगर MyClass रिक्त है:

  • MyClass == null सही
  • का आकलन करती है, क्योंकि यह एक "या" अभिव्यक्ति है, यह कोई फर्क नहीं पड़ता कि क्या इस प्रकार
  • कोई और अधिक मूल्यांकन किया जाता है, अंतिम परिणाम सच है

भाषाओं करना है कि कर रहे हैं शॉर्ट-सर्किट तार्किक अभिव्यक्ति नहीं। शास्त्रीय वीबी एक उदाहरण है, यहां "myClass.Property> 0" का मूल्यांकन किया जाएगा और यदि MyClass शून्य था (जिसे वीबी में "कुछ भी नहीं" कहा जाता है तो एक त्रुटि उत्पन्न होगी)।

0

मूल्यांकन आदेश ऑपरेटर पर निर्भर करता है, इस मामले में बूलियन या (||) को इस काम की तरह संरचना बनाने के लिए आमतौर पर short-circuiting कहा जाता है।

5

लघु सर्किटिंग सी # 3.0 कल्पना की धारा 7.11 में वर्णित है:

ऑपरेशन एक्स || y ऑपरेशन x | से मेल खाता है वाई, सिवाय इसके कि y केवल तभी मूल्यांकन किया गया है जब एक्स सत्य नहीं है।

तो हाँ, आप ठीक हैं।

अन्य भाषाओं के लिए - मैं सभी भाषाओं के लिए कभी भी बात नहीं करना चाहता। वीबी.नेट में, आप ऑरेल और एंडलसो का उपयोग कर सकते हैं जो शॉर्ट-सर्किट हैं, लेकिन सादा या और नहीं हैं।

2

लेकिन सावधान रहें:

अगर आपके पास तरह

sprintf कुछ (buf, "% s% s", func1 (& वर), func2 (& वर));

var पर दुष्प्रभावों के साथ, यह परिभाषित नहीं किया गया है (सी में, मुझे यकीन नहीं है कि मूल्यांकन आदेश अन्य भाषाओं में परिभाषित किया गया है), जिसमें ऑर्डर func1() और func2() निष्पादित किए जाते हैं (यह निर्भर करता है कि आदेश (बाएं या दाएं) तर्क ढेर पर डाल रहे हैं और वहाँ से मूल्यांकन किया।

+0

सी # में सटीक क्रम परिभाषित किया गया है। – Martijn

0

मुझे यकीन है कि नहीं हूँ, क्या तुम सच में क्रम में रुचि रखते हैं या शॉर्ट सर्किट मूल्यांकन में कर रहे हैं?

मैं 100 नहीं कर रहा हूँ % यकीन है, लेकिन जहां तक ​​मुझे पता है कि मूल्यांकन का क्रम हमेशा सी # में समान होगा (और यदि मैं सभी .NET भाषाओं में नहीं हूं तो मुझे लगता है)। शॉर्ट-सर्किट मूल्यांकन पिछले उत्तरों में समझाया गया है।

हालांकि, सी # में आप सरल ऑपरेटर (& & के बजाय शॉर्ट सर्किट का चयन नहीं कर सकते हैं)। आम तौर पर आप शॉर्ट सर्किट करना चाहते हैं, लेकिन यह एक ऐसा मामला हो सकता है जिसमें आप सभी मूल्यांकन निष्पादित करना चाहते हैं।

0

एडा, विजुअल बेसिक और पास्कल जैसी भाषाओं में और/या ऑपरेटर शॉर्ट सर्किट नहीं करते हैं। वे एडीए में "और फिर" और "या अन्य" जैसी कार्यक्षमता को अनुमति देने के लिए अतिरिक्त ऑपरेटरों को प्रदान करते हैं।

0

पायथन में शॉर्ट-सर्किट or और and ऑपरेटर हैं।

0

जावा और हास्केल & & और || शॉर्ट-सर्किट भी। थोड़ी देर में जावा और सी # यह विशिष्ट उन दो ऑपरेटरों के लिए है, (आप अपने खुद के ऑपरेटरों कि ऐसा करने परिभाषित कर सकते हैं) हास्केल में यह स्वाभाविक रूप से भाषा के साथ आता है:

दिलचस्प एक तरफ।

0

वास्तव में शॉर्ट सर्किटिंग हिस्सा है, लेकिन आपको यह भी जानने की आवश्यकता है कि भाषा उन लोगों के बाएं से दाएं मूल्यांकन की गारंटी देती है या नहीं। उदाहरण के लिए सी (एएनएसआई, आईएसओ, सी 99) बाएं से दाएं मूल्यांकन की गारंटी नहीं देते हैं। नमूना कोड में न्यूल की जांच करने से पहले संपत्ति के मूल्य की जांच करना संभव होगा या दोनों एक साथ करें ... अधिकांश कंपाइलर नहीं करते हैं, लेकिन ऐसा करने से इसे रोकने और कुछ भी पूरी तरह से अनुपालन करने से कुछ भी नहीं है। यह आपको इस वजह से इस तरह के कोड लिखने के लिए भी नहीं बताता है।

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