2011-08-16 15 views
47

कुछ पुराने कंपनी कोड के माध्यम से देखकर, मैं एक लूप के लिए आया जो इस तरह दिखता है:लूप के लिए कैसे काम करता है, खासकर (;;) के लिए?

for (;;) { 
    //Some stuff 
} 

मैंने Google की कोशिश की लेकिन मुझे कोई जवाब नहीं मिला। क्या मैं एक प्रोग्रामिंग कक्षा में सो गया था या यह असामान्य पाश है?

उत्तर

70

जावा में एक for पाश निम्नलिखित संरचना है -

for (initialization statement; condition check; update) 
    loop body; 

आप देख सकते हैं, यहाँ चार बयान कर रहे हैं -

  1. प्रारंभ बयान: यह बयान केवल एक बार, जब निष्पादित किया जाता है लूप पहली बार दर्ज किया गया है। यह एक वैकल्पिक कथन है, जिसका अर्थ है कि आप इस क्षेत्र को खाली रखना चुन सकते हैं। यह आमतौर पर कुछ प्रारंभिक उद्देश्य के लिए उपयोग किया जाता है।
  2. सशर्त जांच: यह कथन शायद सबसे महत्वपूर्ण है। यह सत्यापित करने के लिए जांच करता है कि कुछ अभिव्यक्ति का मूल्यांकन सही है या नहीं। यदि ऐसा है, तो लूप निष्पादन जारी है। आप इस क्षेत्र को खाली रखना चुन सकते हैं, जिसका मूल्यांकन true पर किया जाएगा।
  3. अद्यतन: यह कथन सूची बाएं से दाएं से निष्पादित की जाती है, आमतौर पर कुछ चर को बढ़ाने/घटाने के लिए उपयोग की जाती है।
  4. लूप बॉडी: लूप का शरीर, जो सशर्त चेक के सत्य मूल्य के आधार पर बार-बार निष्पादित किया जाएगा।

मूल रूप से यह निष्पादन निम्नानुसार होता है - पहला, जब पहली बार लूप दर्ज किया जाता है, तो प्रारंभिक विवरण एक बार निष्पादित किया जाता है। फिर सशर्त जांच को यह देखने के लिए निष्पादित किया जाता है कि क्या यह सही साबित हुआ है। यदि ऐसा है, तो लूप निकाय निष्पादित किया जाता है, अन्यथा लूप निष्पादन समाप्त हो जाता है। उसके बाद, अद्यतन कथन (हैं) निष्पादित किया गया है। इसके बाद, सशर्त जांच फिर से निष्पादित की जाती है, और यदि यह सत्य का मूल्यांकन करती है, तो फिर लूप बॉडी निष्पादित की जाती है, फिर अद्यतन कथन निष्पादित किया जाता है, फिर फिर सशर्त जांच .... आपको तस्वीर मिलती है।

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

तो आप देखते हैं, यह मूल रूप से एक अनंत लूप है जिसमें प्रारंभिक विवरण नहीं है, जिसका सशर्त चेक हमेशा सत्य का मूल्यांकन करेगा, और जिसमें कोई अपडेट कथन नहीं है। यह

while(true) 
{ 
    ..... 
} 

जो जावा में एक और लोकप्रिय पाश निर्माण है।

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

if(some_condition_is_true) 
    break;  // This will cause execution to break out of its nearest loop 

या

if(some_condition_is_false) 
    break; 
34

इस के समान है।

+0

हालांकि हमें avoi सिखाया जाता है डी अनंत लूप का उपयोग करते हुए, मैं एक से अधिक अवसरों पर थोड़ी देर (सत्य) का दोषी हूं। –

+2

मुझे लगता है कि उनके पास उनके क्षण हैं जहां वे उपयोगी हैं – user489041

+4

कम से कम यदि आप कोड को पढ़ते हुए (सत्य) का उपयोग करते हैं तो इसे समझने की अधिक संभावना होती है ... – PeterT

6

इस लूप में कोई गार्ड नहीं है और कुछ समय (सत्य) लूप के रूप में कार्य करता है। यह ब्रेक तक असीम रूप से लूप होगा।

+3

या वापसी! ... ~ –

+10

या एक स्टैक ओवरफ़्लो –

+0

मुझे इस स्टैक ओवरफ्लो की कल्पना नहीं करनी चाहिए क्योंकि लूप की शुरुआत में कोई स्टैक नहीं है। – Wes

2

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

हालांकि मैं जावा के बारे में अनिश्चित हूँ, this question बताते हैं कि कैसे में नेट अपने खाली for और एक while (true) बिल्कुल वही बात करने के लिए संकलित किया जाएगा। अगर जावा भी करता है तो मुझे आश्चर्य नहीं होगा।

3

यह एक अनंत लूप है। वास्तव में अच्छा कोडिंग नहीं है क्योंकि यह अंतर्ज्ञानी नहीं है जो वास्तव में एक रनटाइम त्रुटि को संकलित या फेंक नहीं देगा। एक अनंत लूप को इंगित करने के लिए while(true) { /* code */ } के रूप में पुनर्लेखन अधिक पढ़ने योग्य होगा।

+0

आप अपने कोड उदाहरण में समापन ब्रैकेट भूल गए; डी –

+0

आप सही हैं कि मेरा कोड इनलाइन टिप्पणी के कारण लिखे गए समापन ब्रैकेट को नहीं उठाएगा, लेकिन मैं बस इसे एक पंक्ति पर रखना चाहता था। –

8

ये सब अनंत लूप बने हैं

for(;;) { 
    // endlessly 
} 

while(true) { 
    // endlessly 
} 

do { 
    // endlessly 
} while(true); 
0

/* जबकि पाश

5 रुपये

1 चॉकलेट = 1 रुपये

while my money is greater than 1 bucks 
    select chocolate 
    pay 1 bucks to the shopkeeper 
    money = money - 1 
end 

घर के लिए आते हैं और नहीं कर सकते, जबकि दुकान के पास जाओ क्योंकि मेरे पैसे = 0 रुपये */

#include<stdio.h> 
int main(){ 
    int money = 5; 

    while(money >= 1){ 
    printf("inside the shopk and selecting chocolate\n"); 
    printf("after selecting chocolate paying 1 bucks\n"); 
    money = money - 1 ; 
    printf("my remaining moeny = %d\n", money); 
    printf("\n\n"); 
    } 

    printf("dont have money cant go inside the shop, money = %d", money); 

    return 0; 
} 

अनंत पैसे

while(codition){ // condition will always true ....infinite loop 
    statement(s) 
} 

कृपया बेहतर समझ के लिए इस वीडियो का दौरा https://www.youtube.com/watch?v=eqDv2wxDMJ8&t=25s

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