2010-09-28 20 views
7

यह देखते हुए कि x = 2, y = 1, और z = 0, निम्न कथन प्रदर्शित होगा?सी ++ ऑपरेटर कैसे काम करते हैं

printf("answer = %d\n", (x || !y && z)); 

यह एक प्रश्नोत्तरी पर था और मुझे मिल गया यह गलत है, मैं अपने प्रोफेसर इस कवर याद नहीं है, किसी को प्रबुद्ध मुझे कृपया ... मैं जानता हूँ कि इस सवाल का जवाब मैं 1, लेकिन क्यों है?

+5

"निम्नलिखित कथन प्रदर्शित होगा?" जाओ इसे अपने आप चलाओ ... यिक्स। यदि आप समझ में नहीं आते हैं और पूछना चाहते हैं "क्यों?", * यह एक उचित सवाल है। –

+0

मुझे पता है, मैंने किया, लेकिन यह मुझे ऑपरेशन के पीछे तर्क समझाता नहीं है:/ – mayotic

+0

संभावित रूप से डुप्लिकेट: http://stackoverflow.com/questions/3375041 – jweyrich

उत्तर

3

अभिव्यक्ति x || (!y &&z) के रूप में व्याख्या की है (ऑपरेटरों ||, ! और && की पूर्वता की जाँच करें।

|| एक short-circuiting ऑपरेटर है। तो बाईं संकार्य || के मामले में सच (है) दाईं ओर संकार्य मूल्यांकन नहीं हो की जरूरत है।

आपके मामले में x सही है, तो एक बूलियन अभिव्यक्ति जा रहा परिणाम होगा 1.

EDIT

&& और || के मूल्यांकन का आदेश बाएं से दाएं होने की गारंटी है।

+0

क्या आप परवाह करेंगे "शॉर्ट सर्किटिंग" समझाते हुए? –

+0

संपादन देखें (लिंक)। –

+2

शॉर्ट-सर्किट बूलियन मूल्यांकन का अर्थ है कि यदि बाएं हाथ की तरफ पूरी अभिव्यक्ति की सत्यता निर्धारित करने के लिए पर्याप्त है, तो दाएं हाथ के मूल्यों का मूल्यांकन नहीं किया जाता है। यह एक ऑप्टिमाइज़ेशन दोनों है, और यह जांचते समय आवश्यक है कि पॉइंटर बाईं ओर शून्य नहीं है, फिर दाईं ओर इसे संदर्भित करना है। || के लिए - या ऑपरेटर - यदि बाएं हाथ का मान सत्य है तो पूरी अभिव्यक्ति सत्य है, और दाएं हाथ का हिस्सा अनचाहे है। –

1

अगर मैं गलत नहीं हूँ, यह 1. प्रिंट होगा

(x || !y && z) या (true || !true && false) पहले का मूल्यांकन करेंगे (मान लेते हैं लघु सर्किटिंग बंद होने पर भी)! ऑपरेटर (true || false && false)

फिर & & दे रही है: (true || false)

फिर

|| : true

Printf के रूप में 1. दशमलव में सच की व्याख्या तो यह answer = 1\n

+1

! पहले मूल्यांकन नहीं किया जाएगा! एक्स होगा। –

+3

गलत - प्रसाद का जवाब देखें और शॉर्ट-सर्किट मूल्यांकन पर विचार करें। –

+0

नोट मैंने कहा कि कोई छोटी सर्किटिंग नहीं मानते हैं। लेकिन अन्यथा आप सही हैं। मैंने सोचा कि वह एक और अधिक सही जवाब चाहते हैं। – JoshD

-2

मैं क्योंकि तुम सिर्फ यह संकलन और इसे चलाने सकता है आप जवाब देने के लिए एकमुश्त नहीं जा रहा हूँ प्रिंट होगा होगा, लेकिन सवाल सिर्फ है यह देखने के लिए परीक्षण करें कि क्या आप ऑपरेटर प्राथमिकता जानते हैं।

-1
answer = 1 

या हो सकता है:

answer = -27 
2 || !1 && 0 
2 || 0 && 0 
2 || 0 
true 
true = non-zero value 
printf("answer = %d",*true*); -> who knows 

सबसे compilers होगा उत्पादन answer = 1। मैं आत्मविश्वास से यह नहीं कहूंगा कि सभी संकलक ऐसा करेंगे, लेकिन मुझे विश्वास है कि सभी कंपाइलर गैर-शून्य वापस आ जाएंगे।

+4

गलत, शॉर्ट सर्किटिंग अप्रासंगिक है। यह केवल एक मामला है कि दुष्प्रभाव होते हैं या नहीं। यह एक साधारण ऑपरेटर प्राथमिकता समस्या है। यदि आप मुझ पर विश्वास नहीं करते हैं, तो ', &' ',' (अल्पविराम ऑपरेटर) के साथ '&&' को बदलने का प्रयास करें। :-) –

+0

@R - टिप्पणी सत्यापित की गई। पोस्ट अपडेट किया गया। – PatrickV

+2

नहीं, उत्तर हमेशा होता है 1. तार्किक और और OR का परिणाम हमेशा '''' या' 1' मान के साथ 'int' होता है। सी ++ वही है, सिवाय इसके कि यह प्रकार 'बूल' है, जिसे 'printf' पर पारित होने पर 'int' में पदोन्नत किया जाता है। –

0

यह देखते हुए कि x = 2, y = 1, और z = 0, क्या निम्नलिखित बयान प्रदर्शन करेंगे?

printf ("answer =% d \ n", (x ||! Y & & z));

ठीक है - एक सा प्रश्न के गरीब शब्दों फिर से कठोर चुटकुले के लिए दोषी महसूस, इसलिए मैं अन्य उत्तर देने के लिए एक अलग तरह से आप मदद का प्रयास करेंगे ... :-)

कब आपके पास ऐसा प्रश्न है, इसे प्रबंधित करने योग्य हिस्सों में को तोड़ दें।

प्रयास करें: सब कुछ आप की जरूरत

int x = 2, y = 1, z = 0; 

printf("true == %d\n", 10 > 2);     // prints "1" 
printf("false == %d\n", 1 == 2);    // prints "0" 
printf("!y == %d\n", !y);      // prints "0" 
printf("(x || !y) == %d\n", x || !y);   // "1" - SEE COMMENTS BELOW 
printf("(!y || z) == %d\n", !y || z);   // "0" 
printf("(x || !y && z) == %d\n", x || !y && z); // "1" 

वहाँ उत्पादन में, आप मिल गया है अनुमान क्या हो रहा है:

  • true == 1 का पता चलता है C/C++ कैसे सच्चा बूलियन अभिव्यक्ति कन्वर्ट printf के लिए अभिन्न मूल्य 1, बूलियन अभिव्यक्ति
  • false == 0 में दिखाई देने वाले मानों के बावजूद सी/सी ++ एफ कैसे परिवर्तित करता है अन्य अभिव्यक्तियों को "0"
  • (!y) == 0 क्योंकि! तार्किक नहीं ऑपरेटर है, और C/C++ केवल अभिन्न मूल्य झूठी करने के लिए इसी पर विचार 0 है, जबकि अन्य सभी !1 == !true == false == 0
  • (x || !y) == 1 सत्य हैं, इसलिए, और आप जानते !y 0 है, तो ज्ञात मानों प्रतिस्थापन और सरल बनाने: (2 || 0) == 1 एक तार्किक नियम
  • (!y || z) == 0 के रूप में समझा जा सकता है कि (true or false) == true ... के बराबर है - प्रतिस्थापन ज्ञात मानों: (0 || 0) == (false or false) == false == 0
  • (x || !y && z) == 1: यहां संकट है! ऊपर से, हम जानते हैं:
    • x || !y 1/सच है, जो अगर प्रासंगिक अर्थ होगा 1/सच & & z/0/गलत == 1/सच < - यह स्पष्ट रूप से कोई मतलब नहीं है, इसलिए यह चाहिए सी/सी ++ जवाब की गणना नहीं कर रहे हैं!
    • (! Y & & z) झूठा है, जो प्रासंगिक है यदि x/2/true || झूठा == 1/सच < - यह सच है, इसलिए यह निहित आदेश होना चाहिए।

इस तरह, हम ऑपरेटर पूर्वता ली गई है - के मूल्यांकन के आदेश || और & & ऑपरेटर, संकलक जो परिणाम प्रदर्शित कर रहे हैं, और देखा कि अगर और केवल & & का मूल्यांकन किया गया है || तो हम परिणामों की कुछ समझ कर सकते हैं।

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