2010-12-07 17 views
18

नए मानक के पुराने से अलग अपरिभाषित व्यवहार है। उदाहरण के लिए, नए अनुक्रमिक नियमों का अर्थ है कि कुछ अंकगणितीय परिचालन जिन्हें अपरिभाषित किया जाता था (अनुक्रम बिंदुओं के बीच एकाधिक लिखने के कारणों के लिए) अब परिभाषित किए गए हैं।सी ++ 03 और सी ++ 11 के बीच अपरिभाषित व्यवहार में क्या अंतर है?

तो, क्या हम नए सिरे से के बारे में अपरिभाषित व्यवहार जानने के लिए की जरूरत है?

+10

ठीक है, सब से पहले ... C++ 0x में अपरिभाषित व्यवहार नाक राक्षसों का कारण नहीं है ... यह बट बंदरों सम्मन। –

+2

मुझे शायद ही लगता है कि यह सीखने लायक है। वे अभिव्यक्ति अभी भी मानव पठनीय नहीं हैं। – UncleBens

+1

@UncleBens: "उदाहरण के लिए" का कौन सा हिस्सा आपके लिए एक बड़े पर्याप्त फ़ॉन्ट में नहीं था? ;-) –

उत्तर

14

मेरी राय में नए नियम वर्णन और समझने के लिए अधिक जटिल हैं। उदाहरण के लिए विचार है कि:

int x = 12; 
x = x++ + 1; // undefined behaviour 
x = ++x + 1; // valid 

मैं बस एक ही अभिव्यक्ति है कि एक नियम को समझने के लिए सरल में एक ही चर के लिए कई दुष्प्रभाव से बचने के लिए सुझाव है। AFAIK C++ 0X ने कुछ मामलों को बदल दिया जो अतीत में अपरिभाषित व्यवहार थे और अब कानूनी उपयोग हैं (उदाहरण के लिए ऊपर दो अभिव्यक्तियों में से दूसरा) लेकिन याद रखें कि कानूनी और क्या है इसके बीच हमेशा अंतर होगा नैतिक है ;-) ... कोई भी ऐसी चीजों का उपयोग करने के लिए मजबूर नहीं कर रहा है।

वास्तव में उपरोक्त मामले में लगता है कि दूसरी अभिव्यक्ति की वैधता भाषा में एक और मुद्दा (# 222) फिक्सिंग का एक पक्ष प्रभाव के रूप में अनजाने हुआ। निर्णय अभिव्यक्ति को वैध बनाना था क्योंकि ऐसा माना जाता था कि यूबी से कुछ परिभाषित करने के लिए कुछ भी बदलना कोई नुकसान नहीं पहुंचा रहा था। मुझे लगता है कि हालांकि इसने कार्यक्रमों को कोई नुकसान नहीं पहुंचाया है (जहां निश्चित रूप से यूबी सबसे बुरी संभावित समस्या है), इसने वास्तव में भाषा को कुछ नुकसान पहुंचाया ... एक ऐसा नियम बदलना जो पहले से ही जटिल और समझने के लिए जटिल था एक और भी अस्पष्ट एक।

आईएमओ सी ++ सी से अपने प्राकृतिक विकास को एक ऐसी भाषा में जारी रख रहा है जहां अच्छे दिखने वाले अच्छे और तार्किक वक्तव्य का एक गुच्छा अद्भुत चीजें कर सकता है ... और जिसमें समान रूप से अच्छा दिखने वाला, समान रूप से अच्छा और समान तार्किक बयान आपके कंप्यूटर को इसके बजाय विस्फोट कर सकता है।

+3

क्या इसका मतलब है कि '+++++++++++++++++++ i' अब वैध अभिव्यक्ति है? –

+0

हाँ ... सी ++ 0 एक्स में यह मान्य है। हाँ मैं सहमत हूं कि यह बेकार है। और डाउनवोट्स के लिए धन्यवाद ... – 6502

+2

जब से सी अच्छा लग रहा था या तार्किक था? सी ++ बदसूरत अर्थशास्त्र सी में डिजाइन दोषों से निकलते हैं, और कोर सी ++ में भी बदतर दोष। यह विकास नहीं है: प्रकार प्रणाली शुरू से खराब हो गई थी। अभी यह है कि कुछ लोग आंतरिक रूप से त्रुटिपूर्ण परिणामों के बारे में सोचने की कोशिश कर रहे हैं जो अब और अधिक स्पष्ट हो रहा है। – Yttrill

3

सी ++ 0x अब पहले से अपरिभाषित मामलों में कई बदलावों को बदलता है सशर्त रूप से समर्थित मामलों। अर्थ विज्ञान है: कार्यान्वयन सशर्त समर्थन सुविधा का समर्थन नहीं करता

  • हैं, तो यह है कि दस्तावेज़ जाएगा और एक प्रोग्राम किया कि यह के लिए एक नैदानिक ​​फेंकना होगा।
  • कार्यान्वयन करता है समर्थन यह है, यह अतिरिक्त आवश्यकताओं स्टैंडर्ड उस पर बनाता है व्यवहार करना चाहिए। उदाहरण के लिए, मानक कह सकता है कि कुछ सशर्त रूप से कार्यान्वित-परिभाषित अर्थशास्त्र के साथ समर्थित है। यदि ऐसा है, तो कार्यान्वयन दस्तावेज करेगा कि यह सुविधा का समर्थन कैसे करता है।

एक लोकप्रिय मामला है कि पहले अपरिभाषित था जब कक्षा एक गैर तुच्छ प्रतिलिपि निर्माता, एक गैर तुच्छ चाल contructor, या एक गैर तुच्छ नाशक हालांकि एक अंडाकार समारोह पैरामीटर होने प्रकार का एक तर्क गुजर रहा है। यह अब सशर्त रूप से समर्थित है, कार्यान्वयन-डीआईएफएड अर्थशास्त्र के साथ।

+0

मेरी इच्छा है कि सी ऐसी अवधारणाओं को जोड़ देगा। जिज्ञासा से, क्या सी ++ प्रोग्राम की एक श्रेणी को परिभाषित करता है जो सशर्त रूप से समर्थित व्यवहार पर भरोसा करता है लेकिन सभी आवश्यकताओं का समर्थन करने वाले कार्यान्वयन पर सही ढंग से व्यवहार करेगा ("अनुरूप" से बहुत कठिन है लेकिन "कड़ाई से अनुरूप" से बहुत कम है?) – supercat

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