कौन सा सही सी # अनंत लूप है, (?;) या जबकि (सच)? [बन्द है]


97

वापस मेरे C / C ++ दिनों में, एक "अनंत लूप" कोडिंग के रूप में

while (true)

अधिक स्वाभाविक महसूस किया और मुझे और अधिक स्पष्ट लग रहा था

for (;;)

1980 के दशक के उत्तरार्ध में पीसी-लिंट के साथ एक मुठभेड़ और बाद में सर्वोत्तम प्रथाओं की चर्चाओं ने मुझे इस आदत को तोड़ दिया। जब से मैंने forनियंत्रण कथन का उपयोग करते हुए छोरों को कोडित किया है । आज, पहली बार एक लंबे समय के लिए, और शायद एक सी # डेवलपर के रूप में अनंत लूप के लिए मेरी पहली ज़रूरत है, मैं उसी स्थिति का सामना कर रहा हूं। क्या उनमें से एक सही है और दूसरा नहीं?


5
दो मिनट के भीतर चार समान जवाब। बुरा नहीं।
जॉन बी

5
आप अपने अनंत पाश को नियंत्रित करके पूरे धार्मिक तर्क से बच सकते हैं। लंबा समय नहीं लेना चाहिए ...
स्टीफन डार्लिंगटन

7
जिज्ञासा से बाहर: C / C ++ में बेहतर (?;) के लिए क्यों है?
विल्क्स-

6
@Vilx जैसा कि मुझे याद है, पुराने कंपाइलर (1) की तुलना में (;) के लिए अधिक कुशल कोड लिखते थे। मुझे यकीन है कि कोई भी सभ्य आधुनिक संकलक बहुत समान कोड का उत्पादन करेगा।
स्टीफन डार्लिंगटन

4
स्टीफन और सेरहियो की टिप्पणियों पर बिल्डिंग: 1. while(true)एक शर्त की आवश्यकता है। for(;;)इसलिए अनंत छोरों के लिए एक बेहतर प्रतिनिधित्व है जो बिना शर्त दोहराते हैं। 2. पुराने अडॉप्टाइजिंग कंपाइलर्स ने वास्तव में मूल्यांकन किया हो सकता है (true)क्योंकि यह लूप किया गया था। 3. सी टेलेटाइप्स, 300 बॉड टर्मिनलों और 1-चर चर नामों के दिनों से एक न्यूनतम भाषा है। ऐसे वातावरण में जहां हर कुंजी स्ट्रोक मायने रखता है, for(;;)की तुलना में काफी कम है while(true)
रिचर्ड डिंगवॉल

जवाबों:


124
while(true)
{

}

क्या हमेशा मैंने जो उपयोग किया है और जो मैंने दूसरों को देखा है वह एक लूप के लिए उपयोग होता है जिसे मैन्युअल रूप से तोड़ना पड़ता है।


@ रॉलबर्ग - यह एक दूसरे के सेकंड के भीतर पेश की गई दो समान प्रतिक्रियाओं के बीच टॉस-अप था। एडम की अनुवर्ती टिप्पणी ने मुझे सम्मेलन के बजाय उपयोग के आधार पर उत्तर स्वीकार करने के लिए प्रेरित किया।
बॉब कॉफमैन

1
जबकि और दोनों के लिए मैन्युअल रूप से तोड़ा जा सकता है
एलन चावल

2
दुर्भाग्य से, यह जवाब सवाल का जवाब नहीं देता है। सही उत्तर है "दोनों सही हैं"।
डेविड आर ट्रिबल

2
@ लॉर्डमास्टर: यह "सही" की आपकी परिभाषा पर निर्भर करता है (या, इसके बजाय कि आप "सुधार" किस तरह के हैं)।
एडम रॉबिन्सन

315

C # कंपाइलर दोनों को रूपांतरित करेगा

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

तथा

while (true)
{
    // ...
}

में

{
    :label
    // ...
    goto label;
}

दोनों के लिए CIL एक ही है। ज्यादातर लोगों while(true)को पढ़ना और समझना आसान लगता है। for(;;)बल्कि गूढ़ है।

स्रोत:

मैंने .NET रिफ्लेक्टर के साथ थोड़ा और गड़बड़ किया , और मैंने विज़ुअल स्टूडियो में "ऑप्टिमाइज़ कोड" के साथ दोनों छोरों को संकलित किया।

दोनों लूप संकलन में (.NET रिफ्लेक्टर के साथ):

Label_0000:
    goto Label_0000;

रैपर्स को जल्द ही हमला करना चाहिए।


7
हाँ, बस डबल जाँच की, अपने सभी एक ही आईएल कोड, यह स्वीकार किया जाना चाहिए जवाब IMO :)
एलन चावल

63
Xkcd सन्दर्भ के लिए +1
Ikke

4
पांडित्यपूर्ण होने के लिए, कंपाइलर एक स्टेटमेंट फॉर्म को दूसरे में नहीं बदलता है; बल्कि, यह दोनों कथनों के लिए समान कोड उत्पन्न करता है। यह कोड एक gotoस्टेटमेंट, btw के समान है , जो कोई आश्चर्य की बात नहीं है।
डेविड आर ट्रिब्लेबल

1
और फिर गोटो को एक jmp निर्देश में अनुवादित किया जाता है ..
मार्को एम

25
तो स्पष्ट रूप goto LOOPसे सही C # अनंत लूप है :)
डस्टिन गेट्ज़

61

मुझे लगता है कि यह पढ़ना आसान हो सकता है और निश्चित रूप से सी # में उपयोग के लिए मानक है:

while(true)
{
   //Do My Loop Stuff
}

19
@ वॉयेजर: 1 C # में 'सही' का विकल्प नहीं है।
एडम रॉबिन्सन

17
ध्यान दें कि जबकि (1) अमान्य है C #: लगातार 1 को बूल में परिवर्तित नहीं किया जा सकता है
Vinko Vrsalovic

4
while(1)C # में मान्य नहीं है, क्योंकि 1a नहीं है bool
पावेल मिनेव

47

हांफना, उपयोग:

while (!false)
{

}

या जैसा कि jsight ने बताया है, आप दोगुना सुनिश्चित होना चाहते हैं:

while (!false && true)
{
}

इससे पहले कि लोग मुझ पर चिल्लाएं, यह सभी एक ही CIL कोड है, मैंने जाँच की :)


सबसे अच्छा जवाब कभी।
लैरी

38

पुराने चुटकुलों के एक जोड़े को पुनः प्राप्त करने के लिए:

  1. " for (;;) {}" का प्रयोग न करें - यह कथन को रोता है।
  2. जब तक, निश्चित रूप से, आप " #define EVER ;;"।

25
या #define ever (;;)जो मुझे लगता है कि अधिक पठनीय है। for ever {}
क्रिस लुत्ज़

1
मैं फ्लॉप लगता है कि आप एक #define कभी कर सकता है (;;) में सी #, हालांकि, मजाक हास्यास्पद है :)
एलन चावल

1
आह। मैं ओएस एक्स पर सी प्रोग्राम करता हूं। मुझे नहीं पता था कि सी # प्रीप्रोसेसर इतना कच्चा था। मुझे भी यकीन नहीं है कि मैंने इस प्रश्न को कैसे पढ़ना शुरू किया, मेरे पास सी # एक उपेक्षित टैग के रूप में है ...
क्रिस लूत्ज़

सी # प्रीप्रोसेसर वास्तव में प्रीप्रोसेसर नहीं है, कम से कम सी, सी ++, पीएल / 1, और यहां तक ​​कि मैक्रो असेम्बलर्स के संदर्भ में नहीं। यह आपको केवल प्रीप्रोसेसर प्रतीकों को परिभाषित / अपरिभाषित करके कोड के ब्लॉक को सक्षम या अक्षम करने की अनुमति देता है।
डेविड आर ट्रिब्बल

6
या इससे भी बेहतर #define forever while(true):;)
रॉबर्टो बोनावलेट

26

यदि आप पुराने स्कूल जाना चाहते हैं, तो गोटो अभी भी C # में समर्थित है:

STARTOVER:  
    //Do something
    goto STARTOVER;

वास्तव में अनंत लूप के लिए, यह गो-टू कमांड है। =)



6
मैंने इसे एक नकारात्मक रेटिंग से शून्य तक बढ़ा दिया, लेकिन केवल इसके हास्य मूल्य के कारण। अरे, सभी छोरों को वैसे भी JMP असेंबलर ऑपकोड में संकलित किया जाता है, है ना?
डेविड आर ट्रिब्लेबल

@ लोमाडमास्टर: धन्यवाद, मैं इसे केवल एक अन्य विकल्प के रूप में बाहर फेंक रहा था, जरूरी नहीं कि इसे समर्थन किया जाए।
JohnFx

2
@serhio: इससे भी अधिक भाषा के निर्माण से बचना है क्योंकि आप कहीं न कहीं कुछ पढ़ते हैं। कोई भी भाषा तत्व अपने आप में बुरा नहीं है, इसका उपयोग केवल बुरे तरीकों से किया जा सकता है।
जॉनफैक्स

2
@serhio: मैंने प्रकृति के खिलाफ घृणा को हर संभव कीवर्ड के बारे में इस्तेमाल करते हुए देखा है। यह भाषा तत्व नहीं है, यह प्रोग्रामर है। किसी भी स्थिति में, जैसा कि मेरी पिछली टिप्पणी में था, मैं इसका समर्थन नहीं कर रहा था। मैं इसे पूर्णता और हास्य का एक तड़का लगाने के लिए शामिल कर रहा था।
JohnFx

21

मुझे लगता while (true)है कि थोड़ा अधिक पठनीय है।


10

उन स्थितियों में जहां मुझे एक सच्चे अनंत लूप की आवश्यकता थी, मैंने हमेशा उपयोग किया है

while(true) {...}

यह कथन के लिए खाली से बेहतर इरादे व्यक्त करता है।


10

व्यक्तिगत रूप से, मैंने हमेशा for(;;)सटीक रूप से पसंद किया है क्योंकि इसकी कोई शर्त नहीं है (जैसा कि while (true)जिसका विरोध हमेशा-सच होता है)। हालांकि, यह वास्तव में एक बहुत ही मामूली शैली बिंदु है, जो मुझे नहीं लगता कि दोनों तरह से बहस करने लायक है। मुझे अभी तक एक C # स्टाइल गाइडलाइन दिखाई दे रही है जो या तो अनिवार्य है या किसी भी तरह से मना करती है।


.NET में लायक नहीं है, जब संकलक आपके (खराब पठनीय) को बिना किसी शर्त के थोड़ी देर के लिए स्थिति में बदल देता है।
14

3
@serhio: कृपया समझाएं कि "कंपाइलर ट्रांसफॉर्म ... इन" से आपका क्या मतलब है while। जहां तक ​​प्रोग्रामर का सवाल है, कंपाइलर उच्च-स्तरीय कोड को IL में बदल देता है। आईएल में कोई while(या for) लूप नहीं हैं , केवल लेबल और गोटो हैं।
पावेल मिनाएव

1
देखें पियरे-एलेन विगेंट का जवाब।
सेरियो जूल

3
उसका उत्तर बेहतर रीफ़्रेश किया जा सकता है क्योंकि बस "कंपाइलर दोनों के लिए समान आईएल बनाता है" (आप वास्तव में यह नहीं जानते हैं कि यह एएसटी स्तर पर कुछ भी बदलता है, और यह किसी भी मामले में कार्यान्वयन विवरण है)। किसी भी स्थिति में, यह स्पष्ट नहीं करता है कि यह ".NET में इसके लायक क्यों नहीं है"। यही बात C ++, Java ...
Pavel Minaev

6

मैं व्यक्तिगत रूप से for (;;)मुहावरे को पसंद करता हूं (सी / सी ++ देखने से आता है)। जबकि मैं मानता हूं कि while (true)एक अर्थ में अधिक पठनीय है (और यह वह है जो मैंने C / C ++ में भी वापस आने के लिए इस्तेमाल किया था), मैं forमुहावरे का उपयोग करने के लिए बदल गया हूं :

  • यह बाहर खड़ा है

मुझे लगता है कि एक लूप समाप्त नहीं होता है (सामान्य फैशन में) 'कॉल आउट' करने के लायक है, और मुझे लगता है कि for (;;)यह थोड़ा अधिक है।


अंत में, इसका उपयोग करते हुए हम थोड़ा और इंतजार करेंगे कि कार्यक्रम संकलित (के लिए संकलन परिवर्तन => जबकि)
serhio

3
@ सेशियो: वास्तव में नहीं। यह इसे से रूपांतरित नहीं करता forहै while। दोनों के लिए for (;;){}और while (true){}, यह नया while(true){}कोड उत्पन्न करता है । इस जवाब को देखें ।
21

6

C के लिए मूल K & R पुस्तक, जिसमें से C # अपने वंश का पता लगा सकता है, अनुशंसित है

for (;;) ...

अनंत छोरों के लिए। यह अस्पष्ट है, पढ़ने में आसान है, और इसके पीछे एक लंबा और महान इतिहास है।

परिशिष्ट (फरवरी 2017)

बेशक, अगर आपको लगता है कि यह लूपिंग फॉर्म (या कोई अन्य रूप) बहुत अधिक गूढ़ है, तो आप हमेशा केवल एक टिप्पणी जोड़ सकते हैं ।

// Infinite loop
for (;;)
    ...

या:

for (;;)    // Loop forever
    ...

1
हां, लेकिन यह C के लिए है, C # के लिए नहीं।
सीरियो जूल

1
यह C # में काम करता है। और सी # भाषा सी
डेविड

4
8 साल बाद आपने अपना जवाब अपडेट करने का फैसला किया। नाइस
मेटोनीम

4

यह while(true)नहीं होना चाहिए while(1), इसलिए while(1)सी # में गलत है, हां;)


3

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

हालांकि मुझे यह पसंद है:

for (float f = 16777216f; f < 16777217f; f++) { } 

2
-1: हर कोई आपके "अनंत लूप" को कोड को नहीं समझ पाएगा, शायद कोई सोच सकता है कि यह एक बग है और इसे "ठीक" करने की कोशिश करें ...
सेरहियो

C # f < 16777217fमें हमेशा से है false... इसलिए यह कभी भी कम नहीं होता है।
नेटमैज

2

मैं थोड़ा और "साक्षर" कोड पसंद करता हूं। मैं अभ्यास में इस तरह से कुछ करने की अधिक संभावना है:

bool shouldContinue = true;
while (shouldContinue)
{
    // ...

    shouldContinue = CheckSomething();
}

1
ओह। वास्तव में, यह do ... while()भेस में एक लूप है। मुझे यह देखने में कुछ ही सेकंड लगे। यदि आपने एक do ... while()लूप लिखा होता, तो यह तुरंत स्पष्ट हो जाता। -1
sbi

क्यों समय और संसाधनों को एक चर घोषित करते समय जब आप (सही) उपयोग कर सकते हैं? यह मेरी राय में कोई मतलब नहीं है
वकासहम्मद

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

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

1
... जिस स्थिति में आपको उपयोग करना चाहिए break
Ry-

2

यहां तक ​​कि मैं यह भी कहता हूं कि नीचे वाला बेहतर है :)

while(true)
{

}

1

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


2
अगर आप गोल्फ कर रहे हैं तो C # गलत भाषा है।
सिंगलएनजेशन इलिमिनेशन

1

कोड पठनीयता के संदर्भ में while(true) भी भाषा में मुझे लगता है कि अधिक समझ में आता है। कंप्यूटर इसे कैसे देखता है इसके संदर्भ में वास्तव में आज के कुशल कंपाइलर और दुभाषियों के समाज में कोई अंतर नहीं होना चाहिए।

यदि कोई प्रदर्शन अंतर है तो मुझे यकीन है कि एमएसआईएल में अनुवाद दूर हो जाएगा। यदि आप वास्तव में चाहते हैं तो आप देख सकते हैं।


1

एकमात्र कारण मैं कहूंगा for(;;) वह कोडडॉम सीमाओं के कारण है (जबकि लूप्स को कोडडॉम का उपयोग करके घोषित नहीं किया जा सकता है और लूप के लिए इसे पुनरावृत्ति लूप के रूप में अधिक सामान्य रूप में देखा जाता है)।

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

एक नोट के रूप में, आप whileलूप बनाने के लिए कोड स्निपेट का उपयोग कर सकते हैं , लेकिन पूरे लूप को स्निपेट बनाने की आवश्यकता होगी ...


1

दोनों का कार्य समान है, लेकिन लोग आमतौर पर पसंद करते हैं while(true)। यह पढ़ने और समझने में आसान लगता है ...


0

कोई भी अभिव्यक्ति जो हमेशा सच होती है जबकि लूप के लिए ठीक होनी चाहिए।

उदाहरण:

1==1 //Just an example for the text stated before 
true

जब आप सही तरीके से काम करते हैं तो आप इसकी तुलना 1 = 1 की तरह करने के लिए कभी क्यों मजबूर होंगे? गणना की गई अभिव्यक्ति का उपयोग करना उतना ही मूर्खतापूर्ण लगता है जितना कि NUMBER_OF_ARMS = 598-3596 जैसे स्थिरांक को परिभाषित करना;
JohnFx

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