2012-06-25 15 views
8

मुझे पता है कि जैसेअनुक्रम बिंदु कहां से आते हैं?

++a = a++; 

कुछ लिख ही अपठनीय नहीं है, लेकिन यह भी C/C++ अनुक्रम अंक उल्लंघन करती है।

ये सीमाएं कहां से आती हैं? उन्हें बग्स के रूप में ढूंढने से पहले उन 'समस्याओं' को कैसे देख सकता है?

+0

ठीक है, फिर भी, क्या यह एक भाषा डिजाइन सीमा है या बल्कि मशीन (सीपीयू) की सीमा है, किसी भी भाषा के लिए आम है? –

+5

'त्रुटि: 'ए' पर ऑपरेशन अपरिभाषित किया जा सकता है [-Werror = अनुक्रम-बिंदु] '- आह, धन्यवाद, आसान कंपाइलर। – chris

+1

अपनी सभी चेतावनियों को चालू करें और संकलन करें और चेतावनियों को उन तर्कसंगत त्रुटियों के रूप में देखें जिन्हें आप हैं और आपको इसके बारे में चिंता करने की आवश्यकता नहीं होगी: '-Werror -Wall -Wextra -ansi -pedantic' –

उत्तर

8

असल में प्रत्येक कथन के बीच एक सी ++ 03 अनुक्रम बिंदु है। अधिक जानकारी के लिए SO C++ FAQ देखें। अधिक जानकारी के लिए सी ++ मानक से परामर्श लें, और ध्यान रखें कि सी ++ 11 मानक अनुक्रम बिंदुओं में और से पहले अनुक्रमित संबंधों के बाद अनुक्रमित किया गया था।

समस्याओं से बचने के लिए, बस प्रत्येक अभिव्यक्ति में बहुत कुछ करने के बारे में बहुत चालाक होने की कोशिश न करें।

कंपाइलर की नौकरी करने की कोशिश न करें: इसे कंपाइलर पर छोड़ दें। आपका काम कोड लिखना है कि अन्य इंसान आसानी से समझ सकते हैं, यानी स्पष्ट कोड। साइड इफेक्ट्स वाले ऑपरेटरों के एकाधिक अपडेट और अनावश्यक उपयोग उस के साथ संगत नहीं हैं।

युक्ति: const छिड़कें बस हर जगह संभव है।

इससे संभावित राज्य परिवर्तनों को बाधित किया जाता है जो पाठक को ध्यान में रखना चाहिए।

+0

जवाब के लिए धन्यवाद। काश मैं यहां कई उत्तरों को स्वीकार कर सकता हूं;) –

4

How can one see those 'problems' before finding them as bugs?

कठोरतम स्तर के साथ अपने कार्यक्रम संकलित करें और के लिए सभी चेतावनियों त्रुटियों के रूप में कहा जा करने के लिए सेटिंग सक्षम करें। अधिकांश मुख्यधारा के कंपाइलर अनुक्रम बिंदुओं के कारण अपरिभाषित व्यवहार त्रुटियों को इंगित करते हैं।

जीसीसी के साथ आप उपयोग कर सकते हैं:

-Wsequence-point 

जो अनुक्रम बिंदु समस्याओं का कहना है जाएगा। ध्यान दें कि यदि आप -Wall का उपयोग करते हैं तो यह डिफ़ॉल्ट रूप से सक्षम है।

बेशक, सबसे अच्छा तरीका है और अधिक पठनीय कोड लिखना और लिखना है जो अनुक्रम बिंदु गलत-रोमांच से बचाता है।

+2

@chris: '-Wall' इसे डिफ़ॉल्ट रूप से सक्षम करता है, जैसा कि मैंने पहले ही उल्लेख किया है। –

+0

दरअसल, मैंने इसे गलत तरीके से पढ़ा। '-Wsequence-point' विकल्प के लिए – chris

+0

+1। मुझे इसके बारे में पता नहीं था। '-Wsequence-point' विकल्प के लिए – Nawaz

7

वे सी या सी ++ मानक से आते हैं, जो प्रभावी रूप से sequence points सूचीबद्ध करता है। कुछ साधारण मामलों में, आपका कंपाइलर आपको चेतावनी दे सकता है कि आप अपरिभाषित व्यवहार का आह्वान कर रहे हैं, लेकिन सामान्य मामले में नहीं।

हालांकि, यदि आप अपने उदाहरण जैसे "रोचक" कोड लिख रहे हैं तो आमतौर पर आप केवल अनुक्रम-बिंदु आवश्यकताओं का उल्लंघन कर रहे हैं। भाषा मानक इस तरह के कोड (विशेष रूप से जावा जैसी भाषाएं) पर विशेष बाधा लगा सकता है, लेकिन ऊपर की ओर बहुत अधिक नहीं है, और कुछ प्रकार के अनुकूलन को रोकने के संभावित नकारात्मक पक्ष हैं।


1. शब्दावली सी ++ 11 में थोड़ा बदल गया है, लेकिन सिद्धांत अभी भी काफी हद ही है, मुझे लगता है।

+0

उत्तर के लिए धन्यवाद। काश मैं यहां कई उत्तरों को स्वीकार कर सकता हूं;) –

+0

मैंने कुछ समय पहले सी ++ 98 और सी ++ 11 के बीच अंतर के बारे में एक प्रश्न का उत्तर दिया: http://stackoverflow.com/a/10655884/365496 – bames53