2012-02-22 15 views
5

मैं मूल बातें सी पर काम कर रहा था और नीचे दी गई समस्या को हल करने की कोशिश कर रहा था क्या कोई यह समझा सकता है कि परिवर्तनीय c का आउटपुट अलग क्यों है?आउटपुट में सी क्यों नहीं बढ़ी है?

निम्नलिखित प्रोग्राम का आउटपुट क्या है?

int main() 
{ 
    int a = -3, b = 2, c= 0, d; 
    d = ++a && ++b || ++c; 
    printf ("a = %d, b = %d, c = %d, d = %d", a, b, c, d); 
} 

उत्तर: -2, 3, 0, 1

क्यों c उत्पादन में वृद्धि की जाती है ना?

+1

d = ((-2 && 3) || (++ ग))। इससे पहले कि यह सी हो जाता है, यह छोटा सर्किट होता है। –

+0

आप वास्तव में क्या करने की कोशिश कर रहे हैं? या आप बस कुछ कोड के साथ खेल रहे हैं? – Bart

+0

बस पहेली को हल करना – Nisha

उत्तर

10

चर c वृद्धि नहीं है, क्योंकि एक || की आरएचएस (दाएँ हाथ की ओर) निष्पादित नहीं है, बशर्ते एलएचएस गलत का आकलन, और एलएचएस सही का आकलन। सी || और && ऑपरेटर 'शॉर्ट-सर्किट' ऑपरेटर हैं; वे दूसरे ऑपरेंड का मूल्यांकन नहीं करते हैं जब तक कि अभिव्यक्ति की समग्र सत्य निर्धारित करने के लिए पहले अपर्याप्त न हो।

&&|| से तंग बांधता है, इसलिए आपरेशन के रूप में parenthesized जा सकता है:

d = (++a && ++b) || ++c; 

++a का मूल्य -2, जो सही का आकलन (क्योंकि किसी भी मूल्य है कि 0 नहीं है का आकलन करती है सच); ++b का मान 3 है, जो सत्य का मूल्यांकन करता है; इसलिए && शब्द का मान सत्य है। क्योंकि true || false और true || true दोनों true का मूल्यांकन करते हैं, इसलिए कुल परिणाम जानने के लिए आरएचएस का मूल्यांकन करने की आवश्यकता नहीं है। (&& के लिए समान नियम यह है कि यदि पहला शब्द गलत साबित होता है, तो दूसरे का मूल्यांकन करने की आवश्यकता नहीं होती है क्योंकि समग्र अभिव्यक्ति गलत होनी चाहिए। यदि आपके पास परीक्षण से पहले a = -1; था, तो b वृद्धि नहीं की जाएगी, क्योंकि ++a होगा शून्य हो या गलत, तो && की आरएचएस unevaluated। बेशक, तो c क्योंकि || की एलएचएस झूठी होगा बढ़ा दी है, और आरएचएस समग्र परिणाम निर्धारित करने के लिए मूल्यांकन किया जाना होगा।)

+2

शायद वह समझ में नहीं आता कि कैसे -2 और 3 सही साबित होते हैं। –

+0

@ 0 ए0 डी: मैंने उस पर टिप्पणी की है - आप सही हो सकते हैं। –

9

क्योंकि ++a && ++btrue का मूल्यांकन करता है।

इसे शॉर्ट सर्किटिंग कहा जाता है। परिस्थितियों के अंदर अभिव्यक्तियों का मूल्यांकन बाएं से दाएं से किया जाता है। यदि आपका मामला है, तो OR खंड में पहली स्थिति का मूल्यांकन true पर किया जाता है, तो दूसरे के मूल्यांकन के लिए कोई बिंदु नहीं है, क्योंकि पूरी अभिव्यक्ति true पहले से ही जानी जाती है।

2

सी में, बूलियन लॉजिक ऑपरेटर && और ||short-circuiting हैं। इसका मतलब यह है कि अगर वे बाएं तरफ का मूल्यांकन करते हैं तो वे जवाब देने के लिए पर्याप्त नहीं हैं, तो वे केवल उनके दाहिने तरफ का मूल्यांकन करते हैं।

अपने कोड के लिए, यह कभी नहीं ++c के मूल्यांकन के प्रभाव के बाद से बाएं हाथ की ओर इस प्रकार शून्य नहीं और बूलियन या के परिणाम सही हो जाएगा, और अधिक काम करने के लिए कोई आवश्यकता नहीं है है।

2

यह आलसी बूलियन अभिव्यक्ति मूल्यांकन है। निष्पादन है:

++a-2

++b3

-2 && 31

ठीक है देता है देता है देता है! || के परिणाम की जांच करने की आवश्यकता नहीं है। तो ++c का मूल्यांकन नहीं किया गया है।

नियम है: अभिव्यक्ति भाग X का मूल्यांकन मामलों में नहीं किया जाता है: (0 && X), (1 || X)। यहां 1 बेशक "नहीं 0" है।

2
 
d= ++a && ++b || ++c 
d= ++(-2) && ++b || ++c 
d= -1 && ++b || ++c 
d= true && ++b || ++c 
d= true && ++2 || ++c 
d= true && true || ++c 
d= true || ++c 
d= 1 

है कि यह मोटे तौर पर कैसे दृश्य के पीछे काम करता ...

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