2010-04-09 11 views
8

डेल्फी में, पर विचारडेल्फी में एक लूप के बाद लूप वैरिएबल क्या है?

var 
    i: integer; 

begin 

    for i := 0 to N do 
    begin 
    { Code } 
    end; 

एक सोच सकते हैं कि i = Nfor पाश के बाद, लेकिन करता है डेल्फी संकलक गारंटी है? क्या कोई यह धारणा कर सकता है कि लूप वैरिएबल लूप के अंदर अपने अंतिम मूल्य के बराबर है, डेल्फी if लूप के बाद?

अद्यतन

कुछ सरल छोरों की कोशिश के बाद, मुझे लगता है कि वास्तव में iएक प्लस i पाश पाश के बाद अंदर के अंतिम मूल्य के बराबर है ... लेकिन आप इस पर भरोसा कर सकते ?

+0

क्या आप यह भी सुनिश्चित करते हैं कि एन 'लूप' के बाद दायरे में है? मैं इसे पहले जांचूंगा - क्योंकि मुझे संदेह है कि यह नहीं हो सकता है। – LBushkin

+0

@LBushkin: यह इस बात पर निर्भर करता है कि एन को कैसे घोषित किया जाता है। लेकिन उपर्युक्त कोड उदाहरण में मैं केवल * एन * को "प्लेसहोल्डर" के रूप में उपयोग करता हूं जो लूप वैरिएबल का अंतिम मान हो सकता है। –

+0

@LBushkin, आप बिल्कुल निश्चित हो सकते हैं कि लूप के बाद 'एन' गुंजाइश में होगा क्योंकि यह स्पष्ट रूप से लूप से पहले दायरे में था (या फिर कोड संकलित नहीं होता था)। डेल्फी में दायरा मध्य-कार्य नहीं बदलता है; यह एक समारोह की शुरुआत में शुरू होता है और अंत में समाप्त होता है। –

उत्तर

23

नहीं, डेल्फी किसी भी मूल्य की गारंटी नहीं देता है। लूप के बाहर, परिवर्तनीय अपरिभाषित है - और आईआईआरसी भाषा गाइड उत्कृष्ट रूप से बताता है - इसका मतलब है कि वास्तविक संकलन के कारण लूप के बाहर परिवर्तनीय हो सकता है कि नए कंपाइलर कार्यान्वयन को बदलने के लिए स्वतंत्र हैं।

+5

यह सही है। लूप पूर्ण होने के बाद चर को विशेष रूप से अपरिभाषित करने के लिए प्रलेखित किया गया है। यदि आपको लूप के बाद एक परिभाषित चर की आवश्यकता है, तो –

+3

का उपयोग या दोहराएं इस पर निर्भर करता है कि लूप चर के अंदर लूप चर का उपयोग कैसे किया जाता है, इस पर निर्भर करता है कि संकलक इसे पूरी तरह खत्म कर सकता है और केवल एक सरणी के तत्वों के माध्यम से पुन: उत्पन्न करने के लिए सूचक का उपयोग कर सकता है, उदाहरण के लिए । निक ने कहा कि आप सही हैं –

+0

+1 –

6

मेरा सुझाव है कि एक while पाश का उपयोग कर स्पष्ट है आप पाश के बाद पाश इंडेक्स का उपयोग करने की आवश्यकता है:

i := 0; 
while i <= N 
begin 
    { Code } 
    i := i + 1; 
end; 

के बाद कि पाश समाप्त हो जाता है, तुम्हें पता है कि iN + 1 हो जाएगा (या अधिक से अधिक , यदि N शून्य से कम हो सकता था)।

+0

हां, यह एक बहुत अच्छी विधि है। आखिरकार, लूप के लिए प्रत्येक को इस तरह से थोड़ी देर के रूप में लिखा जा सकता है, लेकिन बिना किसी "कंपाइलर जादू" के। –

+2

आप 'i: = i + 1' के बजाय' इंक (i) 'का उपयोग कर सकते हैं, लेकिन आईआईआरसी संकलक वैसे भी उनका इलाज करेगा। –

7

यदि आप लूप के बाद लूप चर का उपयोग करते हैं तो संकलक वास्तव में एक चेतावनी उत्सर्जित करता है, इसलिए आपको इसे अनिर्धारित मानना ​​चाहिए।

2

यह documented भी है कि for लूप से लूप चर लूप के बाहर अपरिभाषित है।

अभ्यास में: आप चर से प्राप्त क्या करते हैं संकलक सेटिंग्स और कोड जटिलता के आधार पर भिन्न होता है। मैंने कोड में परिवर्तनों को संकलक को एक अलग अनुकूलन पथ में धक्का दिया है, इसलिए इस अपरिभाषित चर के मान को संशोधित किया है।

--jeroen

1

के रूप में कई लोगों ने कहा, मैं चर पाश के बाद अपरिभाषित जा करने के लिए माना जाता है। असली दुनिया के उपयोग में, इसे आपके द्वारा "ब्रेक" करने से पहले अंतिम मूल्य, या लूप को टर्म करने के लिए एन + 1 तक परिभाषित किया जाएगा। उस व्यवहार पर भरोसा नहीं किया जा सकता है, क्योंकि यह स्पष्ट रूप से निर्दिष्ट है कि यह काम करने के लिए नहीं है।

इसके अलावा, कभी-कभी, I भी असाइन नहीं किया जाएगा। मुझे ऑप्टिमाइज़ेशन चालू होने के साथ ज्यादातर इस व्यवहार का सामना करना पड़ा।

इस

I := 1234; 
For I := 0 to List.Count - 1 do 
begin 
    //some code 
end; 
//Here, I = 1234 if List.Count = 0 

तो ... जैसे

कोड के लिए आप पाश के बाद मैं के मूल्य में जानना चाहते हैं, यह एक चर करने के लिए इसे लूप से बाहर जाने से पहले आवंटित करने के लिए बेहतर व्यवहार है।

1

कभी भी लूप के बाद चर के मूल्य पर भरोसा नहीं करते हैं।

अपने कंपाइलर आउटपुट की जांच करें। डेल्फी कंपाइलर आपको इसके बारे में चेतावनी देता है। अपने कंपाइलर पर भरोसा करें।

  1. कभी भी अपने कंपाइलर के संकेतों और चेतावनियों को {$ चेतावनी बंद} से छिपाएं!
  2. जानकारी को चेतावनियों और चेतावनियों के रूप में त्रुटियों के रूप में समझना सीखें!
  3. आपके कोड को तब तक अनुकूलित करें जब तक आपके पास शून्य संकेत और चेतावनियां न हों (नियम 1 का उल्लंघन किए बिना)।
+0

ठीक है, यह शायद थोड़ा सा "सख्त" भी है। उदाहरण के लिए, कई मामलों में चेतावनी "कार्य का वापसी मूल्य ... अपरिभाषित हो सकता है" अप्रासंगिक है। –

+0

यह बहुत दुर्लभ है कि संकलक कहता है कि यह संभव नहीं होने पर कुछ अपरिभाषित हो सकता है। मैंने देखा है कि केवल एक ही मामले में दो सशर्त शामिल हैं जो परिणाम निर्दिष्ट करते हैं और स्वाभाविक रूप से उनमें से एक को चलाना चाहिए।मैं * सभी * चेतावनियों को दबाने के लिए थोड़ा अतिरिक्त कोड मानता हूं, भले ही मुझे पता है कि वे हानिरहित हैं। –

+1

यह अक्सर होता है यदि आप फ़ंक्शन के अंदर अपवाद बढ़ाते हैं, या यदि आप पुराने स्कूल 'परिणाम: = 'विधि के साथ' बाहर निकलें (रिटर्नवैल्यू 'विधि को मिलाते हैं। –

संबंधित मुद्दे