2012-05-23 13 views
5

में & & की प्राथमिकता || की तुलना में अधिक है, तो यह कोड मूल्यांकन नहीं करना चाहिए - बी & & ++ सी पहले, और इस प्रकार आउटपुट 1 2 4 11. होना चाहिए। लेकिन यहां यह लगता है कि 1 2 5 10 देने के लिए संक्षिप्त सर्किट किया गया है। कृपया मदद करें!के मूल्यांकन के आदेश || और सी

int x; 
int a=1,b=5,c=10; 
x=a++||--b&&++c; 
printf("%d %d %d %d\n",x,a,b,c); 
return 0; 

उत्तर

14

इस कोड --b का मूल्यांकन नहीं करना चाहिए & & ++ सी पहले

नहीं ऑपरेटर पूर्वता मूल्यांकन क्रम को प्रभावित नहीं करता। यह सिर्फ मतलब है कि

a++||--b&&++c 

a++||(--b&&++c) 

को equilvalent है तो यह अभी भी a++ है कि पहले का मूल्यांकन किया जाता है, और इस तरह शॉर्ट सर्किट बयान।

+0

तो हम कैसे जानते हैं कि ब्रैकेट कब रखना है और कब नहीं? – Ashwyn

+2

@Ashwyn थम का एक अच्छा नियम है जहां इरादा स्पष्ट नहीं है, ब्रैकेट डालना है। इस मामले में, यह ब्रैकेट्स का मामला नहीं है, आईएमओ यह स्पष्ट है कि क्या होता है। –

+0

@Ashwyn मुझे लगता है कि आप बिंदु खो रहे हैं। आपको यह मानने का अधिकार है कि && || से कड़ा है।लेकिन अभिव्यक्ति अभी भी बाएं से दाएं का मूल्यांकन करती है। –

2

&& की प्राथमिकता अधिक है, जिसका अर्थ यह है कि यह || की तुलना में बाएं और दाएं चीजों के लिए कठिन है। ताकि अभिव्यक्ति

a++ || (--b && ++c) 

|| के बराबर है केवल सही पर बात का मूल्यांकन करता है, तो बाईं तरफ अभिव्यक्ति गैर 0 मूल्यांकन करता है। चूंकि 1 है, केवल a++ का मूल्यांकन किया जाएगा, और b को कम नहीं किया जाएगा और c वृद्धि नहीं की जाएगी।

2

हाँ, && उच्च पूर्वता है, लेकिन है कि केवल निर्धारित करता है समूहीकरण ऑपरेंड के, नहीं आदेश मूल्यांकन के। यहां बेस ऑपरेशन || है, जो बाएं सत्य होने पर इसकी दाहिनी तरफ का मूल्यांकन नहीं किया जाता है, भले ही किनारे पर कौन से ऑपरेशन हों।

1

यहाँ काम पर दो अवधारणाओं रहे हैं

  1. ऑपरेटर संबद्धता
  2. संकलक अनुकूलन लघु सर्किटिंग

सी में || ऑपरेटर सहयोगी छोड़ दिया गया है। नतीजतन, एक ++ का मूल्यांकन पहले किया जाएगा। चूंकि बाईं ओर सत्य है, कंपाइलर अनुकूलन शॉर्ट सर्किटिंग सुनिश्चित करेगा कि || मूल्यांकन नहीं किया जाता है क्योंकि यह अभिव्यक्ति के परिणाम को नहीं बदलेगा।

+0

इसका अनुकूलन या कंपाइलर्स के साथ कुछ लेना देना नहीं है। शॉर्ट-सर्किटिंग मानक परिभाषित व्यवहार है। –

+0

आप इस अर्थ में सही हैं कि कंपाइलर अनुकूलन वैकल्पिक हैं जबकि लघु सर्किटिंग वैकल्पिक नहीं है। लेकिन सहजता से यह एक अनुकूलन है। मैं जवाब संपादित कर दूंगा। धन्यवाद। –

+0

बहुत स्पष्ट! ... –

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