2009-11-07 22 views
9

मैं 'पक्ष प्रभाव' this website से के बारे में पढ़ा:क्यों "एफ = एफ ++" सी में असुरक्षित है?

लेकिन अभी भी क्यों f = f++ असुरक्षित माना समझ में नहीं आता?

किसी व्याख्या कर सकते हैं?

+0

डुप्लिकेट (हालांकि वास्तव में स्पष्ट नहीं की अनुमति यदि आप नहीं जवाब क्यों पता है) http://stackoverflow.com/questions/1678519/difference-between-i-and-i –

+1

"++ i ++" अवैध क्यों है, इसके बारे में कहीं भी एक सवाल है लेकिन इसे खोजना असंभव है! –

+3

यह प्रश्न स्पष्ट रूप से पूछता है कि यह निर्माण असुरक्षित क्यों है।आपके द्वारा संदर्भित प्रश्न में कोड है जो अवैध है _because_ यह निर्माण असुरक्षित है। दो अलग-अलग पूरी तरह से वैध प्रश्न। – joshperry

उत्तर

16

समस्या Sequence Points है। इस अनुसूची में कोई अनुक्रम बिंदु नहीं है, इसलिए कथन के लिए कोई परिभाषित आदेश नहीं है, क्या असाइनमेंट पहले या वृद्धि हो रहा है?

कुछ भी नहीं है कि यह असुरक्षित है कहते हैं, यह सिर्फ अपरिभाषित है, जिसका अर्थ है अलग कार्यान्वयन अलग परिणाम हो सकता है या यह आपके हार्ड ड्राइव फ़ॉर्मेट कर सकते हैं कि ...

+2

मुझे लगता है कि ज्यादातर लोग एक ड्राइव को 'f = f ++' के असुरक्षित परिणाम स्वरूपित करने पर विचार करेंगे। हालांकि मुझे लगता है कि ज्यादातर लोग कहते हैं कि 'असुरक्षित' का अर्थ यह नहीं है कि यह कुछ नष्ट कर सकता है, लेकिन आप इस पर निर्भर नहीं कर सकते कि यह क्या करेगा। –

+0

सी और सी ++ मानक काफी स्पष्ट रूप से "अपरिभाषित व्यवहार" शब्द का उपयोग करते हैं, और विशेष रूप से उस अनुभाग में जो अनुक्रम बिंदु निष्पादन आदेश का विवरण देता है। मैं केवल असुरक्षित और अपरिभाषित के बीच के अंतर को बढ़ाने के लिए हाइपरबोले का उपयोग कर रहा था। – joshperry

+4

अपरिभाषित व्यवहार का मतलब असुरक्षित कोड – hasen

4

x और x++ (या ++x) के भीतर एक ही बयान है का उपयोग करना या तो वेतन वृद्धि x काम करने से पहले, या उस के बाद: सी में अपरिभाषित व्यवहार संकलक जो कुछ भी यह चाहता है करने के लिए स्वतंत्र है। ओलाफुर के कोड लेते हुए यह f == 5 या f == 6 उपज सकता है, अपने संकलक पर निर्भर करता है।

4

(cleaned up) link आपके द्वारा दी गई पर लेख जवाब देता है। "सी लगभग कोई वादा नहीं करता है कि एक ही अभिव्यक्ति के भीतर एक अनुमानित क्रम में दुष्प्रभाव होंगे।" इसका मतलब है कि आप नहीं जानते कि किस क्रम में = और ++ होगा। यह संकलक निर्भर है।

यदि आप उसी लेख पर sequence points के आलेख में उस आलेख के लिंक का पालन करते हैं, तो आप देखेंगे कि कंपाइलर अनुकूलित कर सकता है कि जब यह रजिस्टरों से वैरिएबल में मूल्यों को वापस लिखता है।

+0

स्पष्टीकरण का एक अतिरिक्त बिट - यह केवल संकलक निर्भर नहीं है। कंपाइलर क्या कर सकता है, इसका कोई मतलब नहीं हो सकता है - यहां तक ​​कि इस बिंदु पर कि एक ही कथन के 2 उदाहरण ('f' के लिए समान प्रारंभिक मूल्य के साथ) पूरी तरह से अलग-अलग परिणाम उत्पन्न कर सकते हैं। –

0

मैं इस संबंध में आर्थर की जवाब समर्थन करते हैं। हालांकि पोस्ट वृद्धिशील ऑपरेटर का कार्यान्वयन i.e f ++ भ्रमित है, इसे असुरक्षित नहीं माना जाता है। यू को पहले समझना चाहिए कि कंपाइलर इसका व्याख्या कैसे करता है। क्या यह वाक्य की समाप्ति (;) या एफ के मूल्य का उपयोग करने के तुरंत बाद सामना करने के बाद एफ बढ़ेगा।

+1

सी मानक के अर्थ में यह * अनिर्धारित * है। यह एक मामला नहीं है "आपको पता होना चाहिए कि कंपाइलर क्या करता है"। संकलक कुछ भी कर सकता है, जिसमें एफ को मूल्य प्रदान करना शामिल है जो परमाणु निर्देशों के किसी भी क्रम के अनुरूप नहीं है जो आपको लगता है कि इसे उत्पन्न करना है। –

1
से

standard

6,5 (2) एक अदिश वस्तु पर एक पक्ष प्रभाव एक ही अदिश वस्तु पर या तो एक अलग पक्ष प्रभाव या एक मूल्य गणना एक ही अदिश के मूल्य का उपयोग करने के लिए unsequenced रिश्तेदार है ऑब्जेक्ट, व्यवहार अपरिभाषित है। यदि अभिव्यक्ति के उप-अभिव्यक्तियों के कई स्वीकार्य क्रम हैं, तो व्यवहार किसी भी क्रम में प्रभाव उत्पन्न होने पर अपरिभाषित है। 74)

74) इस पैरा ऐसे

 
      i = ++i + 1; 
      a[i++] = i; 

के रूप में अपरिभाषित बयान भाव renders

 
      i = i + 1; 
      a[i] = i;