सी

2013-03-25 4 views
6

में पोस्ट वृद्धि का उपयोग करते समय एक चर लौटने पर मेरे पास var नामक एक वैश्विक चर है और एक फ़ंक्शन foo है। (मैं जानता हूँ कि यह एक बुरा व्यवहार है, लेकिन कभी कभी यह अपरिहार्य है) मैं सोच रहा हूँ अगर सी मानक (मैं c99 का उपयोग कर संकलन कर रहा हूँ) का कहना है क्या var करने के लिए होता है, तो मैं निष्पादित करने के लिए प्रयास करें:सी

long foo(){ 
    return var++; 
} 

धन्यवाद।

+0

इसका पुराना मान वापस कर दिया गया है, और वृद्धि मूल्य को संग्रहीत किया जाता है। –

+0

हां। ऐसा लगता है कि यह उम्मीद के रूप में काम कर रहा है। मुझे यकीन नहीं है कि मानक द्वारा निर्णय लेने का सही विचार है। – mgoszcz2

+1

यह ठीक है - वैश्विक वैरिएबल के रूप में ठीक है। –

उत्तर

9

लघु जवाब:

यह var की एक प्रति वापस आ जाएगी और उसके बाद तुरंत बाद वैश्विक var को बढ़ा देते।

लांग जवाब:

C11 6.5.2.4

"पोस्टफ़िक्स का परिणाम ++ ऑपरेटर संकार्य का मूल्य है के रूप में एक पक्ष प्रभाव, संकार्य वस्तु का मूल्य है। वृद्धि .. "।/-/ परिणाम की मान गणना को के साइड इफेक्ट से पहले अनुक्रमित किया गया है जो ऑपरेंड के संग्रहीत मूल्य को अद्यतन करता है।

मानक 5.1.2.3 "कार्यक्रम निष्पादन" निर्दिष्ट करता है कि सभी दुष्प्रभाव से पहले कार्यक्रम एक अनुक्रम बिंदु का सामना करना पड़ता चाहिए मूल्यांकन किया गया है। (अनुक्रम बिंदुओं के बारे में बहुत कुछ here पाया जा सकता है)।

return कथन (सी 11 6.8/4) के बाद अनुक्रम बिंदु है।

इसका मतलब है कि var++ अभिव्यक्ति मुख्य() जारी रखने से पहले पूरी तरह से मूल्यांकन की गारंटी है।

आपकी मशीन कोड इस छद्म कोड तरह दिखेगा:

  • स्टोर स्टैक पर var की स्थानीय प्रतिलिपि (या एक में आदि रजिस्टर)
  • साथ 1.
  • वापसी वैश्विक var बढ़ाएँ उप दिनचर्या से।
  • "कॉपी-ऑफ -var" का उपयोग करें।

यदि आपने इसके बजाय उपसर्ग वृद्धि का उपयोग किया था, तो कॉपी ऑपरेशन को संग्रहीत करने से पहले अनुक्रमित किया गया होगा।

+0

शायद यह उल्लेख करने लायक है कि उपरोक्त "मशीन कोड" दिखाता है कि वैश्विक चर पर ++ क्यों थ्रेड सुरक्षित नहीं है। "स्टोर कॉपी" और "वृद्धि" के बीच एक संदर्भ स्विच जो 'var' (या तो पढ़ने या लिखने के लिए) प्राप्त करता है, अप्रत्याशित प्रोग्राम व्यवहार का कारण बन सकता है। – Lundin

2

foo()var का वर्तमान मान वापस करेगा, और var बढ़ जाता है।

4

var++ के रूप में, एक के बाद वेतन वृद्धि है यह मूल रूप से कुछ इस तरह है:

long foo(){ 
    long tmp = var; 
    var++; 
    return tmp; 
} 

आप ++var बजाय उपयोग करते हैं, यह संख्या बढ़ मान प्रदान करेंगे (के रूप में यह से पहले चर बढ़ेगी, जब लौटने अपनी मूल्य)।