खोज…


टिप्पणियों

अंतर्राष्ट्रीय मानक आईएसओ / आईईसी 9899: 201x प्रोग्रामिंग भाषाएं - सी

एक वाष्पशील वस्तु तक पहुंचना, एक वस्तु को संशोधित करना, एक फ़ाइल को संशोधित करना, या एक फ़ंक्शन को कॉल करना जो उन सभी कार्यों में से कोई भी हो, सभी दुष्प्रभाव हैं , जो निष्पादन वातावरण की स्थिति में परिवर्तन हैं।

ए और बी के भावों के मूल्यांकन के बीच एक अनुक्रम बिंदु की उपस्थिति का अर्थ है कि ए से जुड़े प्रत्येक मूल्य गणना और साइड इफेक्ट को बी से जुड़े हर मूल्य गणना और साइड इफेक्ट से पहले अनुक्रमित किया जाता है।

यहाँ सी भाषा मानक के ऑनलाइन 2011 पूर्व-प्रकाशन मसौदे के अनुलग्नक सी से अनुक्रम बिंदुओं की पूरी सूची है:

अनुक्रम अंक

1 निम्नलिखित 5.1.2.3 में वर्णित अनुक्रम बिंदु हैं:

  • एक फ़ंक्शन कॉल और वास्तविक कॉल में फ़ंक्शन डिज़ाइनर और वास्तविक तर्कों के मूल्यांकन के बीच। (6.5.2.2)।
  • निम्नलिखित ऑपरेटरों के पहले और दूसरे ऑपरेंड के मूल्यांकन के बीच: तार्किक और && (6.5.13); तार्किक या || (6.5.14); अल्पविराम , (6.5.17)।
  • सशर्त के पहले ऑपरेंड के मूल्यांकन के बीच ? : दूसरे और तीसरे ऑपरेटर के ऑपरेटर और जो भी मूल्यांकन किया जाता है (6.5.15)।
  • एक पूर्ण घोषणाकर्ता का अंत: घोषणाकर्ता (6.7.6);
  • एक पूर्ण अभिव्यक्ति के मूल्यांकन के बीच और अगली पूर्ण अभिव्यक्ति का मूल्यांकन किया जाना है। निम्नलिखित पूर्ण अभिव्यक्तियाँ हैं: एक इनिशियलाइज़र जो एक यौगिक शाब्दिक का हिस्सा नहीं है (6.7.9); एक अभिव्यक्ति बयान में अभिव्यक्ति (6.8.3); चयन कथन ( if या switch ) की नियंत्रण अभिव्यक्ति (6.8.4); एक की नियंत्रित अभिव्यक्ति while या do बयान (6.8.5); (वैकल्पिक) एक के भाव से प्रत्येक for बयान (6.8.5.3); , एक return बयान में (वैकल्पिक) अभिव्यक्ति (6.8.6.4)।
  • लाइब्रेरी फंक्शन लौटने से ठीक पहले (7.1.4)।
  • प्रत्येक स्वरूपित इनपुट / आउटपुट फ़ंक्शन रूपांतरण विनिर्देशक (7.21.6, 7.29.2) से जुड़े कार्यों के बाद।
  • तुलनात्मक कार्य के लिए प्रत्येक कॉल के तुरंत पहले और तुरंत बाद, और किसी भी कॉल के बीच तुलना समारोह में और वस्तुओं के किसी भी आंदोलन को उस कॉल के तर्क के रूप में पारित किया (7.22.5)।

अनुभूत भाव

निम्नलिखित भाव अनुक्रमित हैं :

a && b
a || b
a , b
a ? b : c
for ( a ; b ; c ) { ... }

सभी मामलों में, अभिव्यक्ति a पूरी तरह से मूल्यांकन किया जाता है और सभी साइड इफेक्ट या तो पहले ही लागू है b या c मूल्यांकन किया जाता है। चौथे मामले में, b या c से केवल एक का मूल्यांकन किया जाएगा। अंतिम स्थिति में, b का पूरी तरह से मूल्यांकन किया जाता है और c के मूल्यांकन से पहले सभी दुष्प्रभाव लागू होते हैं।

सभी मामलों में, अभिव्यक्ति के मूल्यांकन a अनुक्रम है के मूल्यांकन से पहले b या c (बारी-बारी से, के मूल्यांकन b और c के मूल्यांकन के बाद अनुक्रम कर रहे हैं a )।

इस प्रकार, भाव

x++ && x++
x++ ? x++ : y++ 
(x = f()) && x != 0
for ( x = 0; x < 10; x++ ) { ... }
y = (x++, x++);

अच्छी तरह से परिभाषित व्यवहार है।

अनपेक्षित भाव

C11

निम्नलिखित अभिव्यक्तियाँ अप्रयुक्त हैं :

a + b;
a - b;
a * b;
a / b;
a % b;
a & b;
a | b;

उपरोक्त उदाहरण में, अभिव्यक्ति a से पहले का मूल्यांकन किया जा सकता है या के बाद अभिव्यक्ति b , b से पहले मूल्यांकन किया जा सकता a , या वे भले ही वे कई निर्देश के अनुरूप intermixed जा सकता है।

एक समान नियम फ़ंक्शन कॉल के लिए रखती है:

f(a, b);

यहां न केवल a और b को अनइंस्टॉल किया जाता है (यानी , फ़ंक्शन कॉल में ऑपरेटर एक अनुक्रम बिंदु का उत्पादन नहीं करता है ), लेकिन f भी, अभिव्यक्ति जो फ़ंक्शन को निर्धारित करता है जिसे कॉल किया जाना है।

साइड इफेक्ट को मूल्यांकन के तुरंत बाद लागू किया जा सकता है या बाद के बिंदु तक स्थगित किया जा सकता है।

जैसे भाव

x++ & x++;
f(x++, x++); /* the ',' in a function call is *not* the same as the comma operator */
x++ * x++;
a[i] = i++;

या

x++ & x;
f(x++, x);
x++ * x;
a[i++] = i;

अपरिभाषित व्यवहार देगा क्योंकि

  • किसी वस्तु का संशोधन और उस तक किसी अन्य पहुंच को अनुक्रमित किया जाना चाहिए
  • मूल्यांकन के क्रम और जिस क्रम में दुष्प्रभाव 1 लागू होते हैं, वह निर्दिष्ट नहीं है।

1 निष्पादन पर्यावरण की स्थिति में कोई भी परिवर्तन।

अनिश्चित रूप से अनुक्रमित भाव

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

unsigned counter = 0;

unsingned account(void) {
   return counter++;
}

int main(void) {
   printf("the order is %u %u\n", account(), account());
}

printf तर्कों के मूल्यांकन के दौरान counter का यह निहित द्वैध संशोधन वैध है, हम अभी यह नहीं जानते हैं कि कौन सी कॉल पहले आती है। जैसा कि आदेश अनिर्दिष्ट है, यह भिन्न हो सकता है और इस पर निर्भर नहीं किया जा सकता है। तो प्रिंटआउट हो सकता है:

आदेश 0 1 है

या

आदेश 1 0 है

मध्यवर्ती फ़ंक्शन कॉल के बिना ऊपर का अनुरूप कथन

   printf("the order is %u %u\n", counter++, counter++); // undefined behavior

अपरिभाषित व्यवहार है क्योंकि counter के दो संशोधनों के बीच कोई अनुक्रम बिंदु नहीं है।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow