2009-05-07 6 views
7

स्थिति: सी में हालत की जांच ++ या कई मानदंडों के साथ सी #:सी ++ और सी # में पूर्व निर्धारित या यादृच्छिक अनुक्रम में कई स्थितियों की जांच की जाती है?

if (condition1 && condition2 && condition3) 
{ 
    // Do something 
} 

मैं हमेशा अनुक्रम जिसमें इन चेकों प्रदर्शन कर रहे हैं गारंटी नहीं है माना है। तो यह जरूरी नहीं है कि पहली शर्त 1 फिर condition2 और केवल तब स्थिति 3। मैंने इसे सी ++ के साथ अपने समय में सीखा। मुझे लगता है कि मुझे बताया गया था या इसे कहीं पढ़ा है।

ऊपर तक जानता हूँ कि मैं हमेशा निम्न स्थिति में संभव अशक्त संकेत के लिए खाते की सुरक्षित कोड लिखा है:

if ((object != null) && (object.SomeFunc() != value)) 
{ 
    // A bad way of checking (or so I thought) 
} 

तो मैं लिख रहा था:

if (object != null) 
{ 
    if (object.SomeFunc() != value) 
    { 
     // A much better and safer way 
    } 
} 

क्योंकि मुझे यकीन है कि नहीं था नॉन-नल चेक पहले चलाएगा और केवल तभी इंस्टेंस विधि दूसरी जांच करने के लिए बुलाया जाएगा।

अब हमारे सबसे बड़े समुदाय दिमाग मुझे अनुक्रम बता रहे हैं जिसमें इन चेकों को किया जाता है, बाएं से दाएं क्रम में चलाने की गारंटी है।

मैं बहुत हैरान हूं। क्या यह वास्तव में सी ++ और सी # भाषाओं दोनों के लिए है?

क्या किसी और ने अब संस्करण को सुना है जो मैंने पहले सुना है?

+1

सी # में Subexpressions का मूल्यांकन बाएं से दाएं, हमेशा, अवधि का मूल्यांकन किया जाता है। सी/सी ++ में Subexpressions अनुक्रम-बिंदु क्रम में मूल्यांकन किया जाता है। किसी भी क्रम में एक ही अनुक्रम बिंदु में दो अभिव्यक्तियों का मूल्यांकन किया जा सकता है। यदि आपको औपचारिक परिभाषा की आवश्यकता है तो "अनुक्रम बिंदु" पर एक वेब खोज करें। –

उत्तर

14

संक्षिप्त उत्तर शॉर्ट-सर्किट मूल्यांकन के साथ दाएं उत्तर में छोड़ दिया गया है। आदेश अनुमानित है।

// perfectly legal and quite a standard way to express in C++/C# 
if(x != null && x.Count > 0) ... 

कुछ भाषाएं ब्रांचिंग से पहले स्थिति में सबकुछ का मूल्यांकन करती हैं (उदाहरण के लिए वीबी 6)।

// will fail in VB6 if x is Nothing. 
If x Is Not Nothing And x.Count > 0 Then ... 

रेफरी: एमएसडीएन C# Operators और उनके आदेश या प्राथमिकता।

+0

@Robert: क्या आपका मतलब यह नहीं है कि "यदि एक्स कुछ भी नहीं है && ..." (या समकक्ष वीबी 6 वाक्यविन्यास)? – RichieHindle

+1

@ रिची हिंडल - हाँ, वीबी 6/वीबीस्क्रिप्ट की मेरी यादें बहुत पुरानी है। मैं –

2

उन्हें मूल्यांकन करने के लिए बाएं से दाएं, और से मूल्यांकन करने के लिए परिभाषित किया जाता है जब उनमें से एक झूठी मूल्यांकन करता है। यह सी ++ और सी # दोनों में सच है।

0

मुझे नहीं लगता कि कोई अन्य तरीका है या नहीं है। यह किसी भी कारण से आदेश के बाहर बयान चलाने का निर्णय लेने वाले संकलक की तरह होगा। :) अब, कुछ भाषाओं (जैसे वीबी.नेट) में शॉर्ट सर्किटिंग के लिए अलग-अलग तार्किक ऑपरेटरों हैं और शॉर्ट-सर्किटिंग नहीं हैं। लेकिन, आदेश संकलन समय पर हमेशा अच्छी तरह परिभाषित किया जाता है।

सी # भाषा स्पेक से operator precedence है। कल्पना ...

असाइनमेंट ऑपरेटरों के अलावा से, सभी द्विआधारी ऑपरेटरों बाएं साहचर्य कर रहे हैं, जिसका अर्थ है कि संचालन बाएं से दाएं प्रदर्शन कर रहे हैं। उदाहरण के लिए, x + y + z (x + y) + z के रूप में मूल्यांकन किया गया है।

+0

अद्यतन कर दूंगा, उपसर्ग, एसोसिएटिविटी और सबएक्सप्रेस मूल्यांकन का क्रम तीन अलग-अलग चीजें हैं। आप सी # में प्राथमिकता से आदेश निर्धारित नहीं कर सकते हैं। –

+0

इसके अलावा, मुझे खेद है कि आपके द्वारा उद्धृत किए गए बिट में विनिर्देश खराब तरीके से लिखा गया है। मैं इसे ठीक करने की कोशिश कर रहा हूं। –

+0

हां, मैं आपका बिंदु देखता हूं। यह प्रतिद्वंद्वी है, लेकिन मुझे लगता है कि ऑपरेशन बाएं-सहयोगी हो सकता है और अभी भी बाएं से दाएं क्रम से मूल्यांकन किया जा सकता है। ऑपरेशन लागू होने से पहले दोनों को मूल्यांकन करने की आवश्यकता है, इसलिए प्राथमिकता मूल्यांकन आदेश को जरूरी नहीं है। लेकिन फिर आपको शॉर्ट सर्किट छोड़ना होगा क्योंकि शॉर्ट सर्किट और दो ऑपरेटरों और तीन ऑपरेंड के साथ काम नहीं करेगा (|| शॉर्ट सर्किट दो के साथ काम नहीं करेगा। –

0

उन्हें बाएं से दाएं प्रदर्शन करना होगा। यह काम करने के लिए शॉर्ट सर्किट मूल्यांकन की अनुमति देता है।

अधिक जानकारी के लिए Wikipedia article देखें।

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