लिंक किए गए लेख को निश्चित रूप से डोनाल्ड नुथ के एन + 1/2 लूप्स के बारे में सही मिलता है । C / C ++ / Java में व्यक्त:
for (;;) {
get next element;
if (at the end) break;
process the element;
}
यह किसी फ़ाइल से लाइनों या वर्णों को पढ़ने के लिए उपयोगी है, यदि आप EOF तक पहुँच चुके हैं, और फिर इसे संसाधित कर रहे हैं। मैं पैटर्न को देखने के लिए इतना for(;;)..if(..)break;अभ्यस्त हूं कि यह मेरे लिए मुहावरा है। (इससे पहले कि मैं नथुना लेख पढ़ चुका था, किताब लिटरेट प्रोग्रामिंग में पुनर्मुद्रित , यह एक "wtf?" हुआ करता था।)
नथ ने कीवर्ड सुझाए loop/while/repeat:
loop:
S;
while C:
T;
repeat
कहाँ Sऔर Tशून्य या अधिक बयानों की एक श्रृंखला के लिए जगह धारक हैं, और Cएक बूलियन स्थिति है। यदि कोई Sवक्तव्य नहीं था, तो यह एक लूप लूप होगा, और यदि कोई Tवक्तव्य नहीं था, तो यह एक लूप होगा।
इस निर्माण को शून्य या अधिक while Cक्लॉस की अनुमति देकर खुद को सामान्यीकृत किया जा सकता है , जिससे यह अनंत छोरों को व्यक्त करने के लिए एकदम सही हो जाता है और फिर कुछ दुर्लभ स्थितियों में दो चेक की आवश्यकता होती है।
उसी लेख में, नुथ ने एक सिग्नलिंग तंत्र का सुझाव दिया जो अपवादों को फेंकने / पकड़ने का एक स्थानीय संस्करण होगा (गोटो का उपयोग करने के लिए एक विकल्प के रूप में)।
मेरे लिए? मेरी इच्छा है कि जावा समर्थित टेल-कॉल ऑप्टिमाइज़ेशन, ताकि मैं आवश्यकतानुसार किसी भी सामान्य नियंत्रण संरचना को व्यक्त कर सकूँ ।
अद्यतन: मैं यह उल्लेख करना भूल गया कि कई C / C ++ / Java प्रोग्रामर को इसके आस-पास एक असाइनमेंट का उपयोग करके मिलता है while:
while ((c = getc(f)) != -1) {
T;
}
नुथ के निर्माण से शब्दों का उपयोग करके, यह स्वीकार्य जब है Sऔर Cएक भी अभिव्यक्ति में जोड़ा जा सकता। कुछ लोग उपरोक्त असाइनमेंट को देखने के लिए नफरत करते हैं, जबकि अन्य लोग उपरोक्त breakमें देखने से नफरत करते हैं for (;;)। लेकिन जब Sऔर Cसंयुक्त नहीं किया जा सकता है, जैसे कि जब Sकई कथन हैं, तो for (;;)कोड को दोहराए बिना एकमात्र विकल्प है। अन्य विकल्प केवल Sकोड को डुप्लिकेट करना है :
S;
while (C) {
T;
S;
}
नुथ का loop/while/repeatविकल्प ज्यादा बेहतर लगता है।