दिलचस्प पोस्ट
जावा का उपयोग करके ईमेल भेजें GUID टक्कर संभव हैं? जीआईटी की शाखाओं में गिट टैग कैसे अलग हैं? PHP 5.3.0 में, फंक्शन "उपयोग" पहचानकर्ता क्या है? वॉटरमार्क / संकेत पाठ / प्लेसहोल्डर पाठ बॉक्स WPF में एक अमान्य सूचक की व्याख्या करना, फिर परिणाम का पता लेना अजगर थ्रेडिंग में शामिल होने के उपयोग () क्या है मैं SQL सर्वर Windows मोड से मिश्रित मोड (SQL Server 2008) में कैसे बदल सकता हूं? जावा के साथ Firebase (गैर- android) जानकारी पुनर्प्राप्त करें एक टेम्पलेट क्लास का कार्यान्वयन और घोषणा उसी हेडर फ़ाइल में क्यों होना चाहिए? XMLHttpRequest से खाली प्रतिक्रिया टेक्स्ट जावा महत्वपूर्ण वर्गों में, मुझे क्या सिंक्रनाइज़ करना चाहिए? जांच करें कि कोई अनुरोध प्राप्त है या पोस्ट JQuery का उपयोग करके मैं एक तत्व का आईडी कैसे प्राप्त करूं? एंड्रॉइड डिवाइस पर सॉफ़्टवेयर कीबोर्ड दृश्यमान है, तो मैं यह कैसे पता लगाऊँ?

कम्पाइलर्स और सी ++ में मूल्यांकन का तर्क क्रम

ठीक है, मुझे पता है कि मानक यह निर्धारित करता है कि सी ++ कार्यान्वयन किसी फ़ंक्शन के ऑर्डर के तर्कों का मूल्यांकन कर सकता है, लेकिन क्या कोई ऐसा कार्यान्वयन है जो इस परिदृश्य में वास्तव में 'लाभ लेता है' जहां यह वास्तव में कार्यक्रम को प्रभावित करेगा?

क्लासिक उदाहरण:

int i = 0; foo(i++, i++); 

नोट: मैं किसी के लिए नहीं देख रहा हूं कि मुझे यह बताने के लिए कि मूल्यांकन के क्रम पर भरोसा नहीं किया जा सकता है, मैं उस बारे में अच्छी तरह जानता हूं मुझे केवल दिलचस्पी है कि क्या किसी भी कंपाइलर्स वास्तव में एक बाएं से दाएं क्रम का मूल्यांकन करते हैं क्योंकि मेरा अनुमान होगा कि अगर वे बहुत खराब लिखित कोड को तोड़ देंगे (ठीक उसी तरह, लेकिन वे अभी भी शिकायत करेंगे)

वेब के समाधान से एकत्रित समाधान "कम्पाइलर्स और सी ++ में मूल्यांकन का तर्क क्रम"

यह तर्क प्रकार, फ़ंक्शन के कॉलिंग सम्मेलन, आर्कटेक्चर और कंपाइलर पर निर्भर करता है। X 86 पर, पास्कल कॉलिंग सम्मेलन बायां से दायां तर्क देता है जबकि सी कॉलिंग सम्मेलन ( __सीडीईएलएल ) में यह सही है कई कार्यक्रम जो कई प्लेटफार्मों पर चलते हैं, वे आश्चर्य को छोड़ने के लिए कॉलिंग सम्मेलनों को ध्यान में रखते हैं।

रेमंड चेन पर एक अच्छा लेख है ब्लॉग अगर आप रुचि रखते हैं आप जीसीसी मैनुअल के स्टैक और कॉलिंग सेक्शन पर एक नज़र भी देख सकते हैं।

संपादित करें: इतने लंबे समय के रूप में हम बाल विभाजित हैं: मेरा जवाब यह एक भाषा प्रश्न के रूप में नहीं बल्कि एक मंच के रूप में व्यवहार करता है भाषा मानक किसी अन्य पर एक या एक को पसंद नहीं करता है और इसे अनिर्दिष्ट रूप से छोड़ देता है शब्दों को ध्यान दें यह नहीं कहता है कि यह अपरिभाषित है। इस अर्थ में निर्दिष्ट नहीं है, जिसका मतलब है कि आप गैर-पोर्टेबल व्यवहार पर भरोसा नहीं कर सकते मेरे पास सी स्पेक / मसौदा काम नहीं है, लेकिन यह मेरे n2798 मसौदा (सी ++) से समान होना चाहिए

अमूर्त मशीन के कुछ अन्य पहलुओं और कार्यों को इस अंतर्राष्ट्रीय मानक में वर्णित किया गया है जो अनिर्दिष्ट है (उदाहरण के लिए, किसी फ़ंक्शन पर तर्कों के मूल्यांकन के आदेश)। जहां संभव हो, यह अंतर्राष्ट्रीय मानक स्वीकार्य व्यवहारों के एक सेट को परिभाषित करता है। ये अमूर्त मशीन के नैतिकतावादी पहलुओं को परिभाषित करते हैं। अमूर्त मशीन का एक उदाहरण इस प्रकार दिए गए प्रोग्राम के लिए एक से अधिक संभावित निष्पादन अनुक्रम और दिए गए इनपुट के लिए हो सकता है।

मुझे सी ++ मानकों में जवाब मिला।

पैराग्राफ 5.2.2.8:

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

दूसरे शब्दों में, यह केवल कंपाइलर पर निर्भर करता है

इसे पढ़ें

यह आपके प्रश्न की एक सटीक प्रति नहीं है, लेकिन मेरा जवाब (और कुछ अन्य) आपके प्रश्न को भी कवर करते हैं

बहुत अच्छे अनुकूलन कारण हैं क्योंकि कंपाइलर सिर्फ सही-से-बायां नहीं चुन सकता है, बल्कि उन्हें भी दिक्कत दे सकता है।

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

और हां, मैंने जीसीसी के कुछ संस्करणों को देखा है, यह बिल्कुल ठीक है। आपके उदाहरण के लिए, foo (0,0) को बुलाया जाएगा, और मैं बाद में 2 होगा। (मैं आपको कंपाइलर का सटीक संस्करण नहीं दे सकता। यह कुछ समय पहले था – लेकिन मुझे यह आश्चर्य हुआ कि यह व्यवहार फिर से पॉप अप नहीं होगा। यह निर्देशों का अनुसूची करने का एक प्रभावी तरीका है)

सभी तर्कों का मूल्यांकन किया गया है। आदेश परिभाषित नहीं (मानक के अनुसार) लेकिन सी / सी ++ के सभी कार्यान्वयन (जो मुझे पता है) फ़ंक्शन तर्कों का दाएं से बाएं मूल्यांकन करते हैं संपादित करें: क्लांग एक अपवाद है (नीचे टिप्पणी देखें)।

मेरा मानना ​​है कि सही-से-बाएं मूल्यांकन क्रम बहुत पुराना है (पहले सी कंपलर के बाद से)। सी ++ के पहले निश्चित रूप से इसका आविष्कार किया गया था, और सी ++ के अधिकांश कार्यान्वयन उसी मूल्यांकन के आदेश को बनाए रखेंगे क्योंकि प्रारंभिक सी ++ कार्यान्वयन केवल सी में अनुवादित है।

फ़ंक्शन तर्कों का मूल्यांकन करने के लिए कुछ तकनीकी कारण हैं। स्टैक आर्किटेक्चर में, तर्क आमतौर पर स्टैक पर धकेल दिया जाता है। सी / सी ++ में, आप वास्तव में निर्दिष्ट की तुलना में अधिक तर्क के साथ फ़ंक्शन कॉल कर सकते हैं – अतिरिक्त तर्कों को समान रूप से अनदेखा कर दिया गया है। अगर तर्कों को बाएं से दाएं मूल्यांकन किया जाता है, और बाएं से दाएं धक्का दिया जाता है, तो स्टैक पॉइंटर के नीचे स्थित स्टैक स्लॉट आखिरी तर्क रखता है, और फ़ंक्शन किसी विशिष्ट तर्क के ऑफसेट पर प्राप्त करने का कोई रास्ता नहीं है (क्योंकि धक्का जाने वाले तर्कों की वास्तविक संख्या कॉलर पर निर्भर करती है)।

दाएं से बाएं पुश ऑर्डर में, स्टैक पॉइंटर के नीचे स्थित स्टैक स्लॉट हमेशा पहले तर्क रखता है, और अगले स्लॉट में दूसरा तर्क होता है। तर्क ऑफ़सेट हमेशा फ़ंक्शन के लिए नियतात्मक होगा (जो लिखा हो सकता है और लाइब्रेरी में कहीं और संकलित, अलग से कहां से कहा जाता है)।

अब, दाएं से बाएं धक्का आदेश सही-से-बाएं मूल्यांकन आदेश को जनादेश नहीं देता, लेकिन प्रारंभिक संकलक में, स्मृति दुर्लभ है। दाएं से बाएं मूल्याँकन आदेश में, एक ही स्टैक में जगह का उपयोग किया जा सकता है (अनिवार्य रूप से, तर्क का मूल्यांकन करने के बाद – जो एक अभिव्यक्ति या मजेदार कॉल हो सकता है!) – रिटर्न वैल्यू पहले से ही सही स्थिति पर है ढेर)। बाएं-से-सही मूल्यांकन में, तर्क मानों को अलग से संग्रहित किया जाना चाहिए और रिवर्स ऑर्डर में स्टैक को वापस धक्का दिया जाना चाहिए।

मुझे उम्मीद है कि अधिकांश आधुनिक कंपलर तर्कों की गणना करने के निर्देशों को दबाने का प्रयास करेंगे, क्योंकि उन्हें सी ++ मानक से स्वतंत्र होने के लिए आवश्यक है और इस तरह कोई अन्योन्याश्रितता कम नहीं है। ऐसा करने से गहराई से पिपलाइंड सीपीयू के निष्पादन इकाइयों को पूरा करने में मदद मिलती है और इस तरह से बढ़ जाती है। (कम से कम मुझे उम्मीद थी कि अनुकूलन झंडे दिए जाने पर अनुकूलक संकलक होने का दावा करने वाला एक कंपाइलर ऐसा करेंगे।)

पिछली बार मैंने 2007 में एक्स 86 हार्डवेयर में वीएस 2005 और जीसीसी 3.x के बीच मतभेद देखा था। इसलिए यह (था?) एक बहुत ही संभावित स्थिति है इसलिए मैं कभी मूल्यांकन मूल्यांकन पर भरोसा नहीं करता। शायद यह अब बेहतर है