2010-10-08 10 views
12

मुझे कोड के मौजूदा बिट में कथन के लिए खाली मिला और मैं सोच रहा हूं कि यह क्या करता है और यह "सुरक्षित" है। यह सिर्फ गलत लगता है।सी # में एक (;;) सुरक्षित है और यह वास्तव में क्या करता है?

for(;;) 
{ 
    //some if statements and a case statement 
} 

धन्यवाद!

+0

सभी को धन्यवाद। एक ब्रेक है और इस मामले में यह बेहतर पठनीयता के लिए कोड बदलने की आवश्यकता है। –

+0

यदि आपको वह उत्तर मिल गया जो आपको चाहिए था, तो आपको लेखक को पुरस्कृत करने के लिए इसके आगे के चेकमार्क पर क्लिक करना चाहिए। :) –

+0

स्पष्टीकरण के लिए http://stackoverflow.com/questions/2888558/java-what-is-for/2888580#2888580 देखें। यह जावा, सी ++ और सी # में सटीक तरीके से काम करता है। और यहां 'राइड) पर इसे पसंद करने के लिए मेरा तर्क है: http://stackoverflow.com/questions/2611246/is-for-faster-than-while-true-if-not-why-do- लोग-use -it/2611529 # 2611529 – jalf

उत्तर

17

यह एक अनंत लूप बनाने का एक तरीका है। यह नियमित for लूप है, लेकिन खाली प्रारंभिकरण, स्थिति और वृद्धि अभिव्यक्ति के साथ। क्योंकि हालत अभिव्यक्ति एक नो-ऑप है, लूप कभी बाहर नहीं निकलता है। यह पूरी तरह से "सुरक्षित" मानता है कि इसकी समाप्ति स्थिति (break या return कथन [या यहां तक ​​कि goto, मुझे लगता है]) कहीं भी।

व्यक्तिगत रूप से, मैं while रों साथ अनंत लूप लिखने के लिए पसंद करते हैं:

while (true) 
{ 
    //some statements and a case statement 
} 

(क्योंकि forयात्रा के लिए है और whileपुनरावृत्ति के लिए है)।

हालांकि, this question (@jailf द्वारा लिंक) पढ़ने के बाद, अब मैं while (42) { ... } पसंद करता हूं।

+5

के बराबर मैं कोड पठनीयता –

+6

बढ़ाने के लिए whiles का उपयोग करता हूं, मैं '(;;) 'अधिक पठनीय के लिए विचार करता हूं। :) अगर मेरे लूप के लिए कोई शर्त नहीं है, तो मुझे एक क्यों लिखना चाहिए (जैसे 'सत्य')? ('के लिए (;;) 'पाठक को स्पष्ट रूप से बताता है" इस लूप के लिए कोई स्थायी स्थिति नहीं है ", जिसे मैं इसे पढ़ने योग्य के रूप में मानता हूं। – jalf

+5

छात्रों और नौसिखियों से पूछने के लिए यह एक दिलचस्प बात है यदि एक पूरी तरह से खाली बूलियन अभिव्यक्ति सच है या झूठी है। हम में से अधिकांश "खाली" को 0/झूठ के समान होने के लिए मानते हैं। लेकिन सी इस अभिव्यक्ति द्वारा दिखाए गए अनुसार सत्य होने के लिए खाली मानते हैं। – abelenky

2

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

जहां तक ​​सुरक्षित है, आप इस बारे में "गलत" महसूस करने में सही हैं। आम तौर पर वहां एक "अगर" स्थिति होगी जहां आप तय करेंगे कि क्या आप लूप जारी रखते हैं या तोड़ते हैं। यदि आप सभी निष्पादन पथों को सत्यापित नहीं करते हैं तो यह बहुत ही अनंत लूप का कारण बन सकता है। मैं कोशिश करता हूं और ऐसा कुछ और करता हूं।

5

यह एक अनंत लूप होने के रूप में बराबर है:

while (true) { 

} 

यह सुरक्षित है। हालांकि आपको बाहरी निकास तंत्र प्रदान करने की आवश्यकता है। आईई, for लूप के भीतर एक ब्रेक के साथ।

1

क्या कोई break, return, या throw कथन थे? यही एकमात्र रास्ता है। क्या ये सुरक्षित है? यह निर्भर करता है कि क्या आप एक अनंत लूप के अंदर सुरक्षित महसूस करते हैं। कुछ अनुप्रयोगों को एक की जरूरत है।

+0

... या कॉल जो फेंक सकता है, कोशिश कर दिखाया जा सकता है। ;-) – Lucero

+0

' goto' आपको भी प्राप्त कर सकता है लूप से बाहर हालांकि मैं इसका उपयोग नहीं करता। –

+0

@Tuzo, हाँ, मैंने कभी इसका उपयोग नहीं किया है इसलिए मैं इस संभावना को भी नहीं सोचता। लेकिन आप बिल्कुल सही हैं। – Lucero

2

इसे कभी-कभी "हमेशा के लिए" लूप कहा जाता है, क्योंकि यह वही करता है। लूप के अंदर या लूप को एक कोशिश/पकड़ ब्लॉक में लपेटने के लिए break; या return; कथन के लिए या तो लूप के लिए देखें। निजी तौर पर, मैं उस तरह की चीज़ से बचने की कोशिश करता हूं।

3

कथन के सभी अभिव्यक्ति वैकल्पिक हैं; उदाहरण के लिए, निम्नलिखित बयान लिए किया जाता है अनंत लूप लिखें:

> for (; ;) { 
>  // ... } 

से MSDN

3

लिया यह while (true) { /**/ } रूप में एक ही है ... अनंत लूप जब तक break या return या इसी तरह की होती है।

सभी यह वास्तव में "करता है" IMO बदसूरत देखो है;)

+1

सी # में, एक '1' बुलियन 'सत्य' के बराबर नहीं है। – Lucero

+0

अच्छी पकड़, तय। –

4

यह एक indefinite or infinite loop के लिए एक आम मुहावरा है। यदि आप ऐसी स्थिति की तलाश में हैं जो शुरुआत में सीमित नहीं है - जैसे कि उपयोगकर्ता इनपुट या अज्ञात आकार की फ़ाइल के अंत में आप जानबूझकर अनिश्चितकालीन पाश हो सकते हैं। आप एक ही चीज़ के लिए while(1) या while(true) देख सकते हैं। उस पर 'वहाँ कोई और अधिक है जब तक इस बात {जो} कर ...'

कि पाश संरचना के अंदर इस तरह के रूप में, एक सशर्त है और एक break statement शायद है:

for(;;) 
{ 
    Console.Write("Enter your selection (1, 2, or 3): "); 
    string s = Console.ReadLine(); 
    int n = Int32.Parse(s); 

    switch (n) 
    { 
     case 1: 
      Console.WriteLine("Current value is {0}", 1); 
      break; 
     case 2: 
      Console.WriteLine("Current value is {0}", 2); 
      break; 
     case 3: 
      Console.WriteLine("Current value is {0}", 3); 
      break; 
     default: 
      Console.WriteLine("Sorry, invalid selection."); 
      break; 
     } 
    if(n==1 || n==2 || n==3) 
     break; // out of the for(;;) loop  

} 

कुंजी है कि क्या यह है " सुरक्षित "या नहीं, यह पता लगाने के लिए कि आप उस लूप को कैसे छोड़ते हैं, या आपका अनिश्चित अनंत लूप एक अनपेक्षित अनंत लूप और बग बन जाएगा। सी # स्थल पर

अधिक for के लिए: HERE

1

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

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