अद्यतन, नीचे देखें!
मैंने सुना है और पढ़ा है कि C ++ 0x एक कंपाइलर को निम्नलिखित स्निपेट के लिए "हैलो" प्रिंट करने की अनुमति देता है
#include <iostream>
int main() {
while(1)
;
std::cout << "Hello" << std::endl;
}
यह स्पष्ट रूप से धागे और अनुकूलन क्षमताओं के साथ कुछ करना है। यह मुझे लगता है कि यह कई लोगों को आश्चर्यचकित कर सकता है।
क्या किसी के पास इस बात की अच्छी व्याख्या है कि अनुमति देना क्यों आवश्यक था? संदर्भ के लिए, सबसे हालिया C ++ 0x ड्राफ्ट में कहा गया है6.5/5
एक लूप जो, एक स्टेटमेंट के मामले में फॉर-इन-स्टेटमेंट के बाहर,
- लाइब्रेरी I / O फ़ंक्शन के लिए कोई कॉल नहीं करता है, और
- अस्थिर वस्तुओं तक पहुँच या उन्हें संशोधित नहीं करता है, और
- कोई सिंक्रनाइज़ेशन ऑपरेशन (1.10) या परमाणु संचालन (क्लाज 29) करता है
समाप्त करने के लिए कार्यान्वयन द्वारा ग्रहण किया जा सकता है। [नोट: यह संकलक transfor- mations, जैसे कि खाली छोरों को हटाने की अनुमति देने का इरादा है, तब भी जब समाप्ति को साबित नहीं किया जा सकता है। - अंतिम नोट]
संपादित करें:
यह मानक लेख उस मानक पाठ के बारे में कहता है
दुर्भाग्य से, शब्द "अपरिभाषित व्यवहार" का उपयोग नहीं किया जाता है। हालांकि, कभी भी मानक कहता है "संकलक पी मान सकता है," यह निहित है कि एक कार्यक्रम जिसमें संपत्ति नहीं है-पी में अपरिभाषित शब्दार्थ है।
क्या यह सही है, और संकलक को उपरोक्त कार्यक्रम के लिए "बाय" प्रिंट करने की अनुमति है?
यहाँ एक और भी अधिक व्यावहारिक थ्रेड है , जो C के अनुरूप परिवर्तन के बारे में है, गाइ द्वारा शुरू किया गया उपरोक्त उपरोक्त लेख। अन्य उपयोगी तथ्यों के बीच, वे एक समाधान प्रस्तुत करते हैं जो C ++ 0x पर भी लागू होता है ( अपडेट करें : यह n3225 के साथ अब और काम नहीं करेगा - नीचे देखें!)
endless:
goto endless;
एक कंपाइलर को इसे दूर अनुकूलित करने की अनुमति नहीं है, ऐसा लगता है, क्योंकि यह लूप नहीं है, लेकिन एक छलांग है। एक और लड़का C ++ 0x और C201X में प्रस्तावित बदलाव का सारांश प्रस्तुत करता है
लूप लिखने से, प्रोग्रामर या तो जोर दे रहा है कि लूप दृश्य व्यवहार के साथ कुछ करता है (I / O निष्पादित करता है, अस्थिर वस्तुओं तक पहुंचता है, या सिंक्रनाइज़ेशन या परमाणु संचालन करता है), या कि यह अंततः समाप्त हो जाता है। यदि मैं बिना किसी दुष्प्रभाव के एक अनंत लूप लिखकर उस धारणा का उल्लंघन करता हूं, तो मैं संकलक से झूठ बोल रहा हूं, और मेरे कार्यक्रम का व्यवहार अपरिभाषित है। (यदि मैं भाग्यशाली हूं, तो संकलक मुझे इसके बारे में चेतावनी दे सकता है।) भाषा प्रदान नहीं करती है (अब प्रदान नहीं करता है?) दृश्यमान व्यवहार के बिना एक अनंत लूप को व्यक्त करने का एक तरीका है।
3.132 पर n3225 के साथ अपडेट करें: समिति ने पाठ को 1.10 / 24 पर स्थानांतरित किया और कहा
कार्यान्वयन यह मान सकता है कि कोई भी धागा अंततः निम्नलिखित में से एक करेगा:
- समाप्त कर दें,
- लाइब्रेरी I / O फ़ंक्शन को कॉल करें,
- एक वाष्पशील वस्तु तक पहुंच या संशोधन, या
- एक सिंक्रनाइज़ेशन ऑपरेशन या एक परमाणु ऑपरेशन करें।
goto
चाल होगा नहीं अब और काम करते हैं!
int x = 1; for(int i = 0; i < 10; ++i) do_something(&i); x++;
में for(int i = 0; i < 10; ++i) do_something(&i); int x = 2;
? या संभवतः दूसरा तरीका, लूप x
से 2
पहले आरंभीकृत होने के साथ । यह बता सकता है कि do_something
इसके मूल्य के बारे में कोई परवाह नहीं है x
, इसलिए इसका पूरी तरह से सुरक्षित अनुकूलन है, यदि आप इस तरह के परिवर्तन do_something
का मूल्य पैदा नहीं करते i
हैं जो आप अनंत लूप में समाप्त करते हैं।
main() { start_daemon_thread(); while(1) { sleep(1000); } }
बैकग्राउंड थ्रेड में मेरे डेमन को चलाने के बजाय तुरंत बाहर निकल सकते हैं?
while(1) { MyMysteriousFunction(); }
उस रहस्यमयी कार्य की परिभाषा को जाने बिना स्वतंत्र रूप से अनिवार्य होना चाहिए, है ना? तो हम कैसे निर्धारित कर सकते हैं कि यह किसी भी पुस्तकालय I / O फ़ंक्शन को कॉल करता है? दूसरे शब्दों में: निश्चित रूप से कि पहली गोली को काम पर रखा जा सकता है, फ़ंक्शन को कोई कॉल नहीं करता है ।