2008-10-22 20 views
8

एक अन्य पोस्टर ने preferred syntax for infinite loops के बारे में पूछा।अनंत लूप का उपयोग क्यों करें?

एक अनुवर्ती प्रश्न: क्यों क्या आप अपने कोड में अनंत लूप का उपयोग करते हैं?

for (;;) { 
    int scoped_variable = getSomeValue(); 
    if (scoped_variable == some_value) { 
    break; 
    } 
} 

आप for या while खंड में scoped_variable का मूल्य देखने के लिए सक्षम नहीं किया जा रहा चारों ओर प्राप्त करने देता है: मैं आम तौर पर इस तरह एक निर्माण को देखते हैं। "अनंत" लूप के लिए कुछ अन्य उपयोग क्या हैं?

+0

संबंधित प्रश्न: http://stackoverflow.com/questions/224138/infinite-loops-top-or-bottom – CesarB

उत्तर

27

की तरह एक पाश:

while (true) 
{ 
    // do something 
    if (something else) break; 
    // do more 
} 

आप के बजाय शुरुआत (जबकि/के लिए) या अंत (कर-, जबकि) में, बीच में पाश से बाहर तोड़ देता है।

यदि आपके पास जटिल स्थिति है, तो आप कोड को स्पष्ट करने के लिए इस शैली का उपयोग भी करना चाहेंगे।

+2

एफडब्ल्यूआईडब्लू, मैं "जबकि (सत्य)" या "जबकि (1)" से "(;;)" को भी पसंद करता हूं। पढ़ने के लिए आसान, आईएमओ –

+0

अन्यथा अन्यथा एक निर्माण का शानदार उदाहरण डुप्लिकेशन की आवश्यकता है: ए; जबकि (कुछ और) {बी; ए;} –

11

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

8

परिष्कृत राज्य मशीनें। जब तक आप अंत स्थिति तक नहीं पहुंच जाते, तब तक उन्हें समाप्त नहीं होना चाहिए, जिस बिंदु पर आप तोड़ते हैं या वापस आते हैं।

+0

मुझे यह समझ में नहीं आता है। क्यों न सिर्फ कुछ लिखें, "जबकि (! Machine.state == समाप्त हुआ) {machine.nextState();} –

+2

यह जरूरी नहीं होगा, खासकर यदि आप' machine.state' चर का परीक्षण करना चाहते हैं लूप में एक विशेष बिंदु –

0

मैं सी # में पूरा करने के लिए एकाधिक धागे की प्रतीक्षा करते समय उनका उपयोग करता था, लेकिन अब मैं थ्रेडपूल क्लास का उपयोग करता हूं।

2

एक उदाहरण एक संदेश पंप प्रकार परिदृश्य में है, जहां आप रोकने के लिए कहने तक आने वाले किसी भी संदेश को हमेशा के लिए लूप करना चाहते हैं। दूसरा यह है कि यदि आप आवधिक कार्रवाई करना चाहते हैं तो आप इसमें एक नींद के साथ एक अनंत लूप लिख सकते हैं (हालांकि इसके लिए टाइमर के कुछ रूपों का उपयोग करना बेहतर हो सकता है)।

कुछ अन्य जगहें हो सकती हैं जहां लूप को यह निर्धारित करने के लिए कुछ निश्चित कार्य करना पड़ता है कि इसे बाहर निकलना चाहिए या नहीं, और यह केवल break का उपयोग करने के लिए क्लीनर हो सकता है जब यह स्थिति इंगित करने के लिए कुछ बाहरी ध्वज सेट करने के बजाय सही है लूप बाहर निकलना चाहिए।

आम तौर पर मुझे लगता है कि यदि संभव हो तो लूप स्टेटमेंट में अपनी निकास की स्थिति डालने का बेहतर अभ्यास है, इसे break कथन का उपयोग करके लूप से बाहर निकलें, क्योंकि लूप की निकास स्थिति अधिक स्पष्ट है।

8
while(1) 
{ 
    game->update(); 
    game->render(); 
} 

संपादित करें: है यही कारण है कि, मेरे ऐप को मौलिक रूप से अनंत लूप के आसपास आधारित है, और मैं बस हमेशा मुख्य के अंत से गिरकर समाप्त के सौंदर्य पवित्रता के लिए सब कुछ refactor करने के लिए परेशान नहीं किया जा सकता है()।

+1

तो, आप कैसे बाहर निकलते हैं? –

+0

मैं क्लीनप का भार करता हूं और फिर 'बाहर निकलें()' कहता हूं। मुझे इस साफ शटडाउन फ़ंक्शन को वैसे भी चाहिए (उदाहरण के लिए assert()), और दो अलग-अलग निकास पथ क्यों हैं? – Menkboy

4

यह एक अपूर्ण उदाहरण है क्योंकि इसे स्पष्टता, कार्य या प्रदर्शन के नुकसान के साथ एक अंत-परीक्षण लूप होने के लिए दोबारा प्रतिक्रिया दी जा सकती है।

int scoped_variable; 
do { 
    scoped_variable = getSomeValue(); 
} while (scoped_variable != some_value); 

अनंत छोरों को सबसे अधिक बार उपयोग किया जाता है जब पाश उदाहरण नहीं ऊपर या नीचे पर समाप्ति परीक्षण है, सबसे सामान्य स्थिति में। ऐसा तब होता है जब लूप में दो भाग होते हैं: कोड जो प्रत्येक बार निष्पादित होना चाहिए, और कोड जो प्रत्येक पुनरावृत्ति के बीच निष्पादित होना चाहिए। यह सी जैसी भाषाओं में होता है जब फाइल से पढ़ने या डेटाबेस परिणाम प्रोसेसिंग जैसी चीजें करते हैं जहां बहुत कुछ स्पष्ट रूप से किया जाना है। नए प्रतिमान वाले अधिकांश भाषाएं इस तरह के कोड को वास्तव में परीक्षण में रख सकती हैं।

+0

क्या आप वाकई ब्लॉक के बाहर चर के दायरे में हैं? –

+0

और क्यों नहीं: (int scoped_variable; (scoped_variable = getSomeValue())! = some_value;) ; (खाली पाश शरीर)। यह एक सी 99 और एक सी ++ दोनों के रूप में काम करता है सोलारिस पर जीसीसी/जी ++ 4.3.1 का उपयोग कर प्रोग्राम। –

+0

एक स्कोपिंग समस्या को ठीक करने के लिए कोड खंड को संपादित किया गया। कि (...) लूप भी वैध है, लेकिन इसके लिए कुछ असामान्य उपयोग है (...) और बहुत से प्रोग्रामर उस कारण से दूर शर्मिंदा होंगे। – staticsan

0

एम्बेडेड सिस्टम स्थितियों के अलावा अनंत छोरों हमेशा वास्तव में कर रहे हैं:

Repeat 
    Something 
Until Exit_Condition; 

लेकिन कभी कभी EXIT_CONDITION कुछ है कि वास्तव में पाश के अंत में मूल्यांकन किया जा सकता है। आप हमेशा एक ध्वज सेट कर सकते हैं, शेष ध्वज को छोड़ने के लिए उस ध्वज का उपयोग कर सकते हैं और फिर अंत में इसका परीक्षण कर सकते हैं, लेकिन इसका मतलब है कि आप इसे कम से कम दो बार जांच रहे हैं (कोड थोड़ा धीमा है) और व्यक्तिगत रूप से मुझे यह कम स्पष्ट लगता है।

ऐसे समय होते हैं जब गति के लिए व्यापार स्पष्टता समझ में आता है लेकिन ऐसा कुछ जो न तो स्पष्टता देता है और न ही तकनीकी रूप से सही होने की गति देता है? मुझे एक बुरा विचार की तरह लगता है। कोई भी सक्षम प्रोग्रामर जानता है कि जबकि (सत्य) का अर्थ है कि समाप्ति की स्थिति लूप के अंदर कहीं है।

1

लूप में break का उपयोग करना ठीक है या नहीं, इसके संबंध में अन्य प्रश्न हैं। आइए मान लें कि हम सहमत हैं कि यह कभी-कभी ठीक है। उन परिस्थितियों में (उम्मीद है कि दुर्लभ) यदि कई टर्मिनिंग स्थितियां हैं और कोई पहचान योग्य "प्राथमिक" समाप्ति स्थिति नहीं है तो मैं एक अनंत लूप का उपयोग करूंगा।

यह विसंगतियों (यानी) की एक लंबी श्रृंखला से बचाता है और इस तथ्य पर पाठक का ध्यान आकर्षित करता है कि लूप में लगभग (निश्चित रूप से होगा) टूट सकता है।

आखिरकार यह स्वाद का विषय है।

1

मैं उन्हें लिनक्स डिमन्स/सेवाओं को लिखने के लिए उपयोग करता हूं जो कि हत्या/अन्य समाप्ति संकेत प्राप्त होने तक लूप करते हैं।

1

अनंत लूप ज्यादातर डेमॉन/सेवा प्रक्रियाओं या गेम में मुख्य लूप में उपयोगी होते हैं। तुम भी, उन लोगों के साथ प्यारा प्राप्त कर सकते हैं जैसे:

const bool heatDeathOfTheUniverse = false; 
do 
{ 
    // stuff 
} while(!heatDeathOfTheUniverse); 

वे नहीं रूप Fry द्वारा सुझाव दिया गया था धागे जैसी चीजों के लिए "प्रतीक्षा" के लिए इस्तेमाल किया जाना चाहिए। आप उस के लिए थ्रेड ऑब्जेक्ट की जॉइन विधि का उपयोग कर सकते हैं।

bool done = false; 
while(!done) 
{ 
    if(done = AreWeDone()) continue; // continue jumps back to start of the loop 
} 

:

हालांकि, अगर आप एक स्थिति है जहाँ आपके तकनीक नेतृत्व कहते हैं, कर रहे हैं तो आप भी इस तरह सामान कर सकते हैं "अनंत छोरों Verboten रहे & इसलिए कर रहे हैं कई विधि/समारोह & टूट जाता है देता है" बेशक यदि आप तकनीक लीड आपको ऐसी चीजें करने के लिए मजबूर कर रहे हैं तो आपको एक नई नौकरी की तलाश शुरू करनी चाहिए।

जारी रखने वाले कीवर्ड पर अधिक जानकारी के लिए this MSDN आलेख देखें।

3

लगभग सभी ऐप्स अनंतमुख्य लूप का उपयोग करते हैं। ;)

1

वेबसर्वर जबकि पाश एक अनंत का उपयोग करें:

while(true) 
{ 
    //Do something like respond to requests 
} 

वे समाप्त करने के लिए जब तक आप अपने वेब सर्वर अनुप्रयोग को बंद नहीं है।

3

मैं एक मिसाइल की मार्गदर्शन प्रणाली प्रोग्राम करने के लिए एक अनंत लूप का उपयोग करने पर विचार करता हूं।

while (true) { go2Target () ; } 

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

शायद एक शुद्धतावादियों

while (! blown2Bits ()) { go2Target () ; } 

लेकिन फिर कैसे आप blow2Bits विधि लागू करते हैं एहसान होगा? इसका मतलब क्या होगा यदि blow2Bits सच हो गया?

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