5

संभव डुप्लिकेट:
why “++x || ++y && ++z” calculate “++x” firstly ? however,Operator “&&” is higher than “||”पूर्वता

आप सी पूर्वता तालिका को देखें, तो आपको लगता है कि & & || की तुलना में अधिक पूर्वता दिखाई देगा।

लेकिन निम्नलिखित कोड पर एक नज़र डालें:

a=b=c=1; 

++a || ++b && ++c; 

printf("%d %d %d\n",a,b,c); 

यह पता "2 1 1" प्रिंट, जिसका अर्थ यह है कि "++" पहले मूल्यांकन किया जाता है, और एक बार कार्यक्रम देखता है एक सही वहाँ वहां पर रुक जाता है, क्योंकि || के दूसरी तरफ क्या है महत्वपूर्ण नहीं है।

लेकिन चूंकि & & || से, चाहिए नहीं "++ ख & & ++ सी" पहले मूल्यांकन किया जाना है, और फिर परिणाम में "++ एक || परिणाम" वापस खामियों को दूर उच्च पूर्वता है? (इस मामले में कार्यक्रम "1 2 2" प्रिंट करेगा)।

+0

हाँ मैंने इसे पकड़ नहीं लिया। सर उठाने के लिए धन्यवाद। –

उत्तर

13

बस कोष्ठकों के साथ यह कल्पना करने की कोशिश:

++a || ++b && ++c; 

के बराबर होती है

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

जो बाएं से दाएं मूल्यांकन किया जाता है।

यदि & & और || एक ही प्राथमिकता होगी, यह

(++a || ++b) && (++c); 
+0

अच्छा स्पष्टीकरण, धन्यवाद। –

0

&& has higher precedence केवल पार्स पेड़ में। लेकिन संकलक के रूप में

if(!++a) { 
    ++b && ++c; 
} 
+0

यह अनुकूलन नहीं है। –

+0

आप इसे कॉल करने के लिए और अधिक बेहतर कैसे करते हैं। कोई फर्क नहीं पड़ता। –

+0

विचार यह है कि लघु-सर्किटिंग "अनुकूलन" एक गलतफहमी है जो एसओ पर बार-बार आती है। कई मामलों में, ** ** ** शॉर्ट सर्किटिंग अनुकूलन नहीं होगा। उदाहरण के लिए, '++ ए | ++ बी' (शाखा रहित) लगभग +++ || ++ बी' (सशर्त शाखा) की गणना करने के लिए लगभग निश्चित रूप से सस्ता है। यह जानना महत्वपूर्ण है कि शॉर्ट सर्किटिंग वैकल्पिक व्यवहार नहीं है, और परिणाम अलग हैं। –

6

पूर्वता नियम कोड का अनुकूलन केवल कहना है कि यह इस तरह का मूल्यांकन किया जाएगा:

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

अब तर्क ऑपरेटरों की कम सर्किटिंग व्यवहार आता है जो कहता है आप का मूल्यांकन करने के लिए है कि बाएं से दाएं शब्द और परिणाम ज्ञात होने पर रोकें। दाईं ओर का हिस्सा कभी निष्पादित नहीं होता है।

+0

गोचा। क्या आप मुझे एक उदाहरण दे सकते हैं जहां & quot; की प्राथमिकता कोई फर्क नहीं पड़ता? धन्यवाद –

+0

यह यहाँ मायने रखता है। अगर उनके पास समान प्राथमिकता थी या यदि '||' की उच्च प्राथमिकता थी, तो इसका मूल्यांकन '(++ ए || ++ बी) और ++ सी' के रूप में किया जाएगा, इसलिए' ++ a' और '++ c' मूल्यांकन किया जाएगा। –

+0

अच्छा बिंदु। धन्यवाद। –

0

आपका उदाहरण ++a || ++b && ++c++a || (++b && ++c) जैसा ही है।

2

मूल्यांकन की प्राथमिकता और क्रम दो पूरी तरह से अलग चीजें हैं। तार्किक ऑपरेटर अभिव्यक्तियों के लिए, मूल्यांकन हमेशा बाएं से दाएं है।अभिव्यक्ति ++a || ++b && ++c रूप

  1. मूल्यांकन ++ एक
  2. हैं 1 का परिणाम शून्य है, व्याख्या की है का मूल्यांकन ++ ख & & ++ सी

अभिव्यक्ति है ++a || (++b && ++c) के रूप में पार्स ; संपूर्ण अभिव्यक्ति सत्य है यदि उपसर्गों में से कोई भी ++a या ++b && ++c सत्य है।

+0

गोटो, और हाँ मेरा भ्रम यह मानना ​​था कि मूल्यांकन के पहले भी प्रभावित आदेश। –

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

  • कोई संबंधित समस्या नहीं^_^