2010-07-22 7 views
63

मैं इस सवाल है, जो मैं के बारे में पहले सोचा था, लेकिन सोचा यह जवाब देने के लिएक्या यह स्वयं प्रारंभिक वैध है?

int x = x + 1; 
int main() { 
    return x; 
} 

मेरा प्रश्न कार्यक्रम के व्यवहार परिभाषित या अपरिभाषित है कि क्या करता है, तो यह बिल्कुल वैध है तुच्छ नहीं है है। यदि यह परिभाषित किया गया है, तो का मान main में जाना जाता है?

+0

दिलचस्प। कम से कम जीसीसी 1 देता है, यहां तक ​​कि '-std = C++ 98 -pedantic' के साथ भी। – Philipp

+0

MSVC9 (15.00.30729.01) के साथ इसे संकलित करना 1. – akira

+0

अनुक्रम बिंदु दिमाग में आता है http://en.wikipedia.org/wiki/Sequence_point –

उत्तर

98

मुझे यकीन है कि यह परिभाषित किया गया है, और एक्स के पास मान होना चाहिए 1. §3.6.2/1 कहता है: "स्थिर भंडारण अवधि (3.7.1) वाले ऑब्जेक्ट्स शून्य-प्रारंभिक (8.5) किसी अन्य से पहले होंगे प्रारंभिकता होती है। "

उसके बाद, मुझे लगता है कि यह सब बहुत सरल है।

+10

+1 और , किसी भी अन्य प्रारंभिक होने से पहले अद्भुत, कितना सूक्ष्म अभी तक महत्वपूर्ण है। " है। –

+12

एचएम के लिए – GManNickG

+4

मेरी इच्छा है कि यह अपरिभाषित था, तब हम कह सकते हैं कि सामान लिखना मुश्किल नहीं है, इसका मतलब यह है कि मानक में इसे देखे बिना इसका मतलब क्या है। –

6

.bs में संग्रहीत 'x' चर, जो प्रोग्राम लोड करते समय 0 से भरा हुआ है। नतीजतन, जब प्रोग्राम स्मृति में लोड हो जाता है तो 'x' का मान 0 होता है।

फिर मुख्य कहने से पहले, "x = x + 1" निष्पादित किया जाता है।

मुझे नहीं पता कि यह मान्य है या नहीं, लेकिन व्यवहार अपरिभाषित नहीं है।

11

मेरा सवाल यह है कि कार्यक्रम का व्यवहार परिभाषित या अनिश्चित है यदि यह बिल्कुल मान्य है। यदि यह परिभाषित किया गया है, तो x का मान मुख्य में ज्ञात है?

यह कोड निश्चित रूप से साफ नहीं है, लेकिन मेरे लिए यह अनुमानित रूप से काम करना चाहिए।

int x चर को डेटा सेगमेंट में डालता है जिसे प्रोग्राम शुरू होने पर शून्य माना जाता है। main() से पहले, स्थैतिक प्रारंभकर्ता कहा जाता है। x के लिए कोड x = x + 1 है। x = 0 + 1 = 1। इस प्रकार मुख्य() वापस आ जाएगा 1.

कोड x एक स्थानीय चर है, जो स्टैक पर आवंटित है, तो कोड निश्चित रूप से अप्रत्याशित फैशन में काम करेगा। डेटा सेगमेंट के विपरीत, स्टैक स्टेटस, अनिर्धारित कचरा रखने की काफी गारंटी है।

0

मुख्य कॉल x को 0 से शुरू किया जाना चाहिए, इसलिए यह मान 1 होना चाहिए जो आप मुख्य दर्ज करते हैं, और आप वापस आ जाएंगे 1. यह एक परिभाषित व्यवहार है।