दिलचस्प पोस्ट
Android में रिंगटोन / अलार्म ध्वनि कैसे खेलें एक्स्टेंट्स के साथ कई अक्षर बदलें gsub के साथ त्रुटि: पैकेज 'com.google.example' main.xml में विशेषता 'adSize' के लिए कोई संसाधन पहचानकर्ता नहीं मिला एक ही यूआरएल पर एक नए के साथ छवि को ताज़ा करें आप आसानी से कैसे जांच सकते हैं कि प्रवेश फ़ाइल में प्रवेश के लिए निषेध है। NET? कैसे गिट में गिरा दिया छिपाने की जगह को ठीक करने के लिए? Runtime.exec को कॉल करते समय stdout कैप्चर करना सी प्रोग्रामिंग में Fflush (stdin) का उपयोग क्या है नमूना फ़ंक्शन का उपयोग करके प्रशिक्षण / परीक्षण सेट में डेटा को कैसे विभाजित करें I रूट अनुप्रयोग को कैसे परिवर्तित करें? फ्लोट और डबल के बीच का अंतर फ़ॉर्म लोड अपवाद क्यों नहीं पकड़े? IE 11 के लिए एक सीएसएस हैक कैसे लिखूँ? ओएस एक्स (योसेमाइट या एल कैपिटन) के नवीनतम संस्करण की स्थापना के बाद `pg_tblspc` लापता जावा में तारीखों में अंतर की गणना करना

सी ++ फ़ंक्शन मापदंडों में मूल्यांकन का आदेश

अगर हमारे पास तीन फ़ंक्शंस (एफयू, बार, और बाज़) हैं जो इस तरह से बनाये जाते हैं …

foo(bar(), baz()) 

क्या सी ++ मानक से कोई गारंटी है कि बार को बज़ से पहले मूल्यांकन किया जाएगा?

वेब के समाधान से एकत्रित समाधान "सी ++ फ़ंक्शन मापदंडों में मूल्यांकन का आदेश"

नहीं, ऐसी कोई गारंटी नहीं है यह C ++ मानक के अनुसार अनिर्धारित है

बर्जने स्ट्रावट्रुप भी कुछ तर्कों के साथ "सी ++ प्रोग्रामिंग भाषा" का तीसरा संस्करण खंड 6.2.2 में स्पष्ट रूप से कहता है:

अभिव्यक्ति मूल्यांकन आदेश पर प्रतिबंधों के अभाव में बेहतर कोड उत्पन्न किया जा सकता है

हालांकि तकनीकी रूप से यह एक ही खंड के पहले भाग को संदर्भित करता है, जो कहता है कि अभिव्यक्ति के कुछ हिस्सों के मूल्यांकन के आदेश भी अनिर्धारित हैं, यानी

 int x = f(2) + g(3); // udefined whether f() or g() is called first 

बार () और बज़ () के लिए कोई विशिष्ट आदेश नहीं है – केवल एक ही बात मानक कहते हैं कि यह दोनों का मूल्यांकन किया जायेगा foo () से पहले। सी ++ मानक से, खंड 5.2.2 / 8:

तर्कों के मूल्यांकन के क्रम अनिर्दिष्ट हैं।

[5.2.2] फ़ंक्शन कॉल से,

तर्कों के मूल्यांकन के क्रम अनिर्दिष्ट हैं। फ़ंक्शन दर्ज होने से पहले तर्क अभिव्यक्ति मूल्यांकन के सभी दुष्प्रभाव प्रभावी होते हैं।

इसलिए, कोई गारंटी नहीं है कि bar() baz() से पहले चलेंगे, केवल उस bar() और baz() को foo से पहले बुलाया जाएगा।

इसके अलावा [5] अभिव्यक्तियों से ध्यान दें कि:

सिवाय जहां उल्लेख किया गया है [जैसे && और || लिए विशेष नियम ], व्यक्तिगत संचालकों के ऑपरेंडों के मूल्यांकन के मूल्यांकन और व्यक्तिगत अभिव्यक्तियों के उप-प्रक्षेपण, और जिस क्रम में दुष्प्रभाव होते हैं, उनका क्रम अनिर्दिष्ट है।

तो भी अगर आप पूछ रहे थे कि bar() foo(bar() + baz()) में baz() से पहले चलेंगे, तो आदेश अभी भी अनिर्दिष्ट है।