क्या बर्जने स्ट्रॉस्ट्रुप के कोड प्रदर्शनी में std::स्ट्रिंग की चेनिंग अभिव्यक्ति अपरिभाषित व्यवहार प्रदर्शित करती है?
बजर्न स्ट्रॉस्ट्रुप की "द सी प्रोग्रामिंग लैंग्वेज" के चौथे संस्करण में , एक कोड स्निपेट std::string की रिप्लेस विधि का उपयोग करके चेनिंग का उदाहरण देता है:
void f2() {
std::string s = "but I have heard it works even if you don't believe in it";
s.replace(0, 4, "").replace(s.find("even"), 4, "only").replace(s.find(" don't"), 6, "");
assert(s == "I have heard it works only if you believe in it");
}
हालाँकि, यह कोड अपरिभाषित व्यवहार को लागू करने के बजाय अनिर्दिष्ट व्यवहार प्रदर्शित करता है।
इस अनिर्दिष्ट व्यवहार का कारण मूल्यांकन के क्रम में निहित है, जो इसके लिए अनिर्दिष्ट है श्रृंखलाबद्ध फ़ंक्शन कॉल की उप-अभिव्यक्तियाँ। इस मामले में, s.find फ़ंक्शन कॉल का मूल्यांकन पहले s.replace कॉल से पहले या बाद में किया जाता है, जिसके परिणामस्वरूप स्ट्रिंग की लंबाई बदल जाती है और बाद के खोज कॉल के परिणाम को प्रभावित किया जाता है।
प्रश्न में उदाहरण यह प्रदर्शित करता है: जब अलग-अलग कंपाइलरों (क्लैंग, जीसीसी) द्वारा मूल्यांकन किया जाता है, तो अलग-अलग मूल्यांकन आदेशों के कारण अलग-अलग परिणाम प्राप्त होते हैं। चेनिंग फ़ंक्शन कॉल प्रत्येक फ़ंक्शन आमंत्रण के लिए बाएं से दाएं मूल्यांकन क्रम पेश करता है, प्रत्येक कॉल के तर्क केवल उस विशेष फ़ंक्शन कॉल के संबंध में
से पहले अनुक्रमित होते हैं।उदाहरण में, यह अनिश्चितता s.replace(0, 4, "") के संबंध में s.find("even") और s.find(" don't") के मूल्यांकन में उत्पन्न होती है।
आगे उप को अनदेखा करना -अभिव्यक्ति विखंडन, मूल्यांकन चरणों का क्रम और उनकी अन्योन्याश्रयता को इस प्रकार चित्रित किया जा सकता है:चरण 1: s.replace(0, 4, "") // ए चरण 2: s.find("सम") // बी चरण 3: s.replace(बी, 4, "केवल") // सी चरण 4: s.find("नहीं") // D चरण 5: s.replace(D, 6, "") // E
जबकि A को B से पहले अनुक्रमित किया गया है, जो बदले में C से पहले अनुक्रमित किया गया है, बीच मेंकोई अनुक्रमण संबंध नहीं है
ए के संबंध में बी और डी। परिणामस्वरूप, डी का मूल्यांकन ए से पहले या बाद में किया जा सकता है, जिससे चुने गए अनुक्रम के आधार पर अलग-अलग परिणाम मिलते हैं।Step 1: s.replace(0, 4, "") // A Step 2: s.find("even") // B Step 3: s.replace(B, 4, "only") // C Step 4: s.find("don't") // D Step 5: s.replace(D, 6, "") // E
सी 17 मानक पोस्टफ़िक्स-अभिव्यक्तियों और उनकी अभिव्यक्ति-सूची के लिए मूल्यांकन नियमों के क्रम को मजबूत करता है, जिससे प्रश्न में कोड को अच्छी तरह से निर्दिष्ट व्यवहार मिलता है। अनुक्रम इस प्रकार है:
पोस्टफ़िक्स-अभिव्यक्ति को अभिव्यक्ति-सूची में प्रत्येक अभिव्यक्ति से पहले अनुक्रमित किया जाता है।प्रत्येक पैरामीटर का आरंभीकरण किसी के संबंध में अनिश्चित रूप से अनुक्रमित होता है अन्य पैरामीटर।
इसलिए, सी 17 और बाद में, यह कोड हमेशा सही मूल्यांकन करेगा।अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3