अंदर "विराम" के साथ "जबकि (सच)" लूप के लिए शब्द क्या है? [बन्द है]


24

मान लीजिए कि मेरे पास C ++ या C # में एक लूप है जो इस प्रकार है:

while( true ) {
    doSomething();
    if( condition() ) {
        break;
    }
    doSomethingElse();
}

इसे आमतौर पर "अनंत लूप" कहा जाता है। फिर भी यह तकनीकी रूप से अनंत नहीं है - नियंत्रण से गुजरते ही यह बंद हो जाएगा break

ऐसे लूप के लिए क्या शब्द है - जिसमें "लूप फॉरएवर" लूप कंट्रोल स्टेटमेंट है और अंदर "ब्रेक" है?


22
मुझे नहीं लगता कि कोई विशेष शब्द है।
ChrisF

2
क्या कोई गारंटी है कि नियंत्रण कभी भी प्रवाह से होगा? उस उदाहरण में, क्या होगा अगर condition()हमेशा झूठे वापस आए? मैं कहूंगा कि यह सशर्त विराम के साथ एक अनंत लूप है।
जॉन डे

1
यहां तक ​​कि बिना break, लूप अनंत नहीं है ( kill, सीटीएल-एल्ट-डेल, अनप्लग ...)। तो क्यों शब्दावली विवरण के साथ परेशान?
मौविसील

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

5
यह प्रश्न ऑफ़-टॉपिक प्रतीत होता है क्योंकि यह "नाम उस चीज़" का प्रश्न है। "उस चीज़ का नाम" उसी कारणों से बुरे प्रश्न हैं जो "इस अस्पष्ट टीवी शो, फिल्म या पुस्तक को उसके पात्रों या कहानी से पहचानते हैं" बुरे प्रश्न हैं: आप उन्हें Google नहीं कर सकते, वे किसी भी तरह से व्यावहारिक नहीं हैं, वे किसी और की मदद मत करो, और उन्हें अन्य प्रकार के सीमांत सवालों के पूछने के लिए दरवाजा खोलने की अनुमति देता है। ब्लॉग
gnat

जवाबों:


24

सीएस का अध्ययन करते हुए, इस प्रोफेसर ने हमें सिखाया कि प्री-चेकिंग लूप्स ( while(cond) {}), पोस्ट-चेकिंग लूप्स ( do {} while(cond);) और मिड-चेकिंग लूप्स हैं । (मैंने इसे बुरी तरह से अंग्रेजी में अनुवादित किया हो सकता है, लेकिन आपको यह विचार मिलता है।)

C और C ++ में बाद (ISTR Ada के पास, BICBW) नहीं है, इसलिए आपके निर्माण का उपयोग C और C ++ में किया जाता है।


1
हां, एडा के पास यह है:loop ... exit when condition; ... end loop;
कीथ थॉम्पसन

@ कीथ: पुष्टि करने के लिए धन्यवाद! लगभग 20 साल हो गए हैं जब मैंने कुछ एडा किया है।
sbi

1
इसके लायक क्या है, मैं 20 साल से अधिक समय तक एक पेशेवर प्रोग्रामर रहा हूं (और एक शौक से अधिक लंबे समय तक), और मैंने उन शर्तों को कभी नहीं सुना है।
ऑफबी

अनुवाद के बारे में - मुझे लगता है कि "इन" आमतौर पर अधिक उपयुक्त होता है जब "पूर्व" और "पोस्ट" का उपयोग किया जाता है, उदाहरण के लिए "प्रीऑर्डर / पोस्टऑर्डर / इनवर्टर ट्री ट्रैवर्सल"।
ओक

1
जिस शब्द के साथ मैं बड़ा हुआ वह था "मिड-एग्जिट लूप।" मैंने मध्य-निकास छोरों के लिए स्पष्ट समर्थन के साथ विभिन्न भाषाओं के एक जोड़े में काम किया है।
mjfgates

13

स्टैनफोर्ड में सीएस का पहला कोर्स ( मेहरान सहमी द्वारा प्रोग्रामिंग पद्धति ) इसे लूप और डेढ़ के रूप में संदर्भित करता है । और यह जरूरी नहीं कि खराब प्रोग्रामिंग अभ्यास हो। उपयोगकर्ता इनपुट एकत्र करने पर इस उदाहरण पर विचार करें ( एरिक रॉबर्ट्स द्वारा जावा की कला और विज्ञान से लिया गया है , जहां रॉबर्ट्स इसे लूप-एंड-ए-हाफ भी कहते हैं ):

prompt user and read in the first value
while (value != sentinel) {
    process the data value
    prompt user and read in a new value
}

और फिर एक ही चीज को डुप्लिकेट कोड से बचने के लिए लूप और एक आधा विचार का उपयोग करके हल किया गया :

while (true) {
    prompt user and read in a value
    if (value == sentinel) break;
    process the data value
}

10

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


मैं कहूंगा, एक गोटो से भी बदतर। मैं बहुत कुछ एक लूप में एक falsly निर्मित हालत की तुलना में एक गोटो देखना चाहते हैं।
ब्रायन नोब्लुक

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

7
लूप के बीच में ब्रेक के साथ कुछ भी गलत नहीं है। यदि आपको चक्र के प्रत्येक प्रारंभ में कुछ ऑपरेशन करने की आवश्यकता है, तो आपको या तो कोड को डुप्लिकेट करना होगा या इन ऑपरेशनों को स्थिति में सामान करना होगा। या तो संस्करण स्पष्ट रूप से नुकसान है। gotoयह भी वैध अनुप्रयोग था, जैसे एक कोशिश का अनुकरण ... अंत में सी में ब्लॉक
मैल्कम

1
मैल्कम: संभावित समस्या यह है कि कोड पढ़ने के दौरान, यह देखना कठिन है कि लूप कब और क्यों बाहर निकलता है। अतिरिक्त समस्याएं तब उत्पन्न होती हैं जब आप दो या अधिक ऐसे लूपों को घोंसला बनाते हैं, और आंतरिक लूप में पाए गए एक शर्त के आधार पर बाहरी लूप से बाहर निकलना चाहते हैं।
user281377

मान लें कि आपके पास एक एक्सग एप्लिकेशन ड्राइविंग इवेंट लूप है, जैसे (छद्म कोड में :) while(XEventGet(&ev) != NULL){ ... }, आप स्वाभाविक रूप से लूप के अंदर कुंजियों की जांच करना चाहते हैं if(ev.key == XK_q) break;:। निम्न कार्य करना: while(XEventGet(&ev) != NULL && ev.key != XK_q){ ... }मध्य लूप ब्रेक की तुलना में पढ़ने में बदसूरत और यकीनन कठिन है। इसके अलावा, क्या होगा अगर किसी चीज़ को जाँचने से पहले मूल्य पर किया जाना चाहिए? आप गंभीरता से लूप के आधार मामले में सभी को सामान करने के लिए नहीं जा रहे हैं, क्या आप हैं?
ब्रैडेन बेस्ट

8

कोई निश्चित नाम नहीं है। अनंत लूप है, मुझे लगता है, उपयुक्त शब्द। कोई भी छोर वास्तव में अनंत नहीं हैं, लेकिन इसमें प्रभावी रूप से अनंत होने की संभावना है क्योंकि यह संभव है कि जिस शाखा में ब्रेक होता है वह कभी नहीं होगा।

यदि आप किसी को "अनंत लूप बनाते हैं, और स्थिति X के लिए विराम का उपयोग करते हैं" और वे जानते हैं कि आपको क्या मतलब है। यदि कोई आपके कोड की समीक्षा कर रहा है और कहता है कि "मुझे आपके द्वारा लिखे गए अनंत लूप पसंद नहीं है" से अधिक कुछ नहीं है, तो आपको पता चल जाएगा कि वे किस बारे में बात कर रहे हैं (जब तक कि आपके पास एक से अधिक नहीं है, निश्चित रूप से)।


1
यह एक अनंत लूप नहीं है; यह सामान्य whileलूप की तरह एक अच्छी तरह से परिभाषित समाप्ति स्थिति है, और जिस तरह से आप समाप्ति का प्रमाण देते हैं, वह बिल्कुल वैसा ही है (एक नीरस-घटती हुई मीट्रिक को खोजना एक शानदार शुरुआत है)।
डोनल फैलो

8

यह गलत जगह पर सशर्त के साथ एक-बार लूप है।


2
हाँ, इसे लिखा जाना चाहिए: जबकि (रखना_) {doSomething (); if (अवस्था) {रखना_गाय = झूठ; } और {doSomethingElse (); }}
स्टीफन सकल

10
इसलिए ... आप कह रहे हैं कि यदि आप एक कंप्यूटर पाठ्यक्रम पढ़ा रहे हैं और इसका वर्णन करना चाहते हैं, तो आप कहेंगे "और अब, हम इस गलत जगह पर सशर्त के साथ * डू-जबकि लूप के बारे में जानने जा रहे हैं। "? यह एक नाम के बजाय एक धार्मिक राय की तरह लगता है।
ब्रायन ओकले

5
@StephenGross यह कोड स्निपेट एक भयानक सुझाव है। वास्तविक स्थिति को लूप की परिभाषा में रखने के लिए रिफ्लेक्टर, या बस का उपयोग करें breakया continue। हर कीमत पर प्रहरी मूल्यों से बचें, वे मानसिक रूप से नज़र रखने के लिए राज्य का एक और मनमाना टुकड़ा हैं, जो कोड के उद्देश्य को उजागर करता है।
इजाकाता

2
प्रहरी मूल्यों में विलम्ब होता है।
विंस्टन एवर्ट

2
-1 सिंगल-एक्जिट वेनी होने के लिए।
डोनाल्ड फेलो

6

मैं "बिना शर्त लूप" के लिए वोट करूंगा , "बिना शर्त कूद" के समान। यह वास्तव में दिखाता है कि क्या चल रहा है (कोड लूप बिना शर्त), बिना झूठ ("अनंत लूप" के विपरीत)।


1
लेकिन यह एक समाप्ति की स्थिति है; कि if/ breakबीच में पैटर्न का हिस्सा है।
डोनल फेलो

5

ऐसे लूप के लिए क्या शब्द है - जिसमें "लूप फॉरएवर" लूप कंट्रोल स्टेटमेंट है और अंदर "ब्रेक" है?

ब्रेक की स्थिति के साथ इसका एक अनंत लूप है।

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


1
यह बिल्कुल भी अनंत नहीं है; वह बिंदु जहाँ समाप्ति की स्थिति की जाँच की जाती है, बस एक अलग स्थान पर है।
डोनल फेलो

5

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


4

कोई मानक शब्द नहीं है, लेकिन मैं इसे आंशिक लूप के रूप में कहूंगा ।

इस लूप का उपयोग तब किया जाता है जब आप लूप के कुछ हिस्से को पिछली बार (यानी आंशिक निष्पादन) निष्पादित करने के बाद ही तोड़ना चाहते हैं । इसका उपयोग तब किया जाता है जब आपको एक उपयुक्त स्थिति नहीं मिलती है जहाँ आप पूरे लूप को तोड़ना चाहते हैं ।

इस मामले में, आप कम से कम doSomething()एक अंतिम बार निष्पादित करने के बाद लूप को तोड़ना चाहते हैं ।


2

मुझे यहां sbi से सहमत होना है - मुझे मध्य-चेकिंग लूप टर्म पसंद है। इस तरह का निर्माण अधिक लोकप्रिय था जब संरचित प्रोग्रामिंग रोल करना शुरू कर दिया था और कई भाषाओं में उनके लिए वाक्यात्मक समर्थन था।

उस ने कहा, यह अब व्यापक ज्ञान है कि whileलूप आमतौर पर अधिक सहज होते हैं, क्योंकि यह आक्रमणकारियों के बारे में तर्क करना आसान होता है और वे अक्सर मुश्किल खाली मामले को बेहतर तरीके से संभालते हैं।

आपके विशेष मामले में आपका लूप इसके बराबर है

for(; doSomething(), !condition(); doSomethingElse()){}

इसलिए मैं केवल प्रयोग करेंगे breakसंस्करण यदि या तो doSomethingया doSomethingElseइसमें शामिल कई बयानों और मैं नहीं बल्कि उन्हें दूर अलग कार्यों में तरह तुमने किया था नहीं डाल चाहते हैं।

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


1

मुझे लगता है कि अगर हम इसके लिए एक शब्द बनाने की कोशिश करने जा रहे हैं, तो हो सकता है:

बच गए लूप


-1। सवाल नाम बनाने के बारे में नहीं है, यह इस बारे में है कि क्या एक सामान्य नाम पहले से मौजूद है। इसके अलावा, सभी लूप "बच गए" हैं, इसलिए यह विशेष रूप से प्रभावी नाम नहीं है।
ब्रायन ओकले

@BryanOakley एक अनंत लूप, परिभाषा के अनुसार, टूटने योग्य नहीं होना चाहिए। शायद इसके लिए एक शब्द नहीं होना चाहिए, इसके अलावा, खराब प्रोग्रामिंग।
लार्सटेक


0

यह हर मामले में इतना बुरा नहीं है। मैं ख़ुद को कुछ ख़ास तरह के एपीआई के साथ इस तरह के लूप लिखता हुआ पाता हूं। उदाहरण के लिए, कहें कि आपके पास एक लूप ऑब्जेक्ट है, और इसमें कुछ गहरी स्थिति की जाँच करने की आवश्यकता है, जैसे:

while (loop
    .getAExecutionModelFactory()
    .getActiveXexecutor()
    .getYCancelModelHandler()
    .getCurrentHandler()
    .isCancelled()) {
        // ... do something with the current Handler ....
        loop = ..... // prepare for next loop
}

अब मान लें कि हर गेटएक्सएक्सएक्स-विधि संभावित रूप से अशक्त हो सकती है। तब एक बूलियन अभिव्यक्ति लिखना अभी भी संभव होगा, हालांकि काफी जटिल और अपठनीय। और फिर हमें वर्तमान हैंडलर ऑब्जेक्ट पर प्राप्त करने के लिए लगभग समान करना होगा। ऐसे मामलों में, मुझे while (true)ब्रेक और जारी रखने के साथ लूप लिखना आसान लगता है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.