मैं (;;) निर्माण के लिए इतने सारे क्यों देख रहा हूं? [बन्द है]


14

मेरे सोचने के तरीके के लिए, लूप के लिए एक ज्ञात या निर्धारित सीमा से अधिक का उपयोग किया जाता है।

String[] names = //something;
for ( int i = 0; i < names.length; i++ ) { //do stuff }

जो समतुल्य है (i की एक तरफ):

String[] names = //something;
int i = 0;
while (i < names.length )
{
   // do stuff
   i++;
}

दूसरे शब्दों में, forलूप आमतौर पर उपयोग किए जाने वाले whileनिर्माण के लिए एक (अत्यधिक उपयोगी) सिंटैक्टिक चीनी है ।

हालाँकि, मैं for(;;)वेब पर बहुत सारे निर्माण देख रहा हूँ जो कार्यात्मक रूप से इसके समकक्ष हैंwhile(true)

इसके लिए तर्क क्या है? लूप के लिए अनंत को लूप के लिए अनंत पर क्यों पसंद किया जाएगा?

// मैंने एक जावा पाठ्यपुस्तक भी देखी जो लूप्स का उपयोग नहीं करती थी! इस तरह के राक्षसी निर्माण के लिए अग्रणी:

String input = getInput();
for( ; !inputIsValid(input) ; )
{
   //redo;
}

मुख्य कारण वरीयता है। हालांकि YMMV को पसंद करते समय पठनीयता को खेलना चाहिए।
एरोन मैकिवर

क्यों कोई अजीब निर्माण पसंद करेगा?
क्रिस कूडमोर

10
आप स्वैप कर सकते हैं whileऔर forयहाँ और प्रश्न नहीं बदलेगा। while(true)और for(;;)इसका मतलब वही है। आप स्पष्ट रूप से के लिए एक मजबूत प्राथमिकता है while, दूसरों के लिए एक समान रूप से मजबूत प्राथमिकता हो सकती है for। यह कहना असंभव है कि एक दूसरे की तुलना में अधिक सही है।
कालेब

3
@ क्रिस, मैं बिल्कुल भी for(;;)भ्रमित नहीं हूँ । यह एक मानक C मुहावरा है, जिसे आप K & R (2e) के खंड 3.5 में प्रलेखित करेंगे। मैं समझता हूं कि आपको यह पसंद नहीं है; आपको यह समझना चाहिए कि अन्य स्पष्ट रूप से इसे पसंद करते हैं (अन्यथा आप इसे कभी नहीं देखेंगे)। यह सी के अलावा अन्य भाषाओं में कम या ज्यादा स्वीकार्य हो सकता है; आपने इस भाषा-अज्ञेय को टैग किया है जो केवल एक निश्चित उत्तर के प्रतिपुष्टि को कम करता है। फिर से, मैंने बंद करने के लिए मतदान किया क्योंकि क्यू रचनात्मक नहीं है; अगर मुझे बुरा लगा तो मैं बंद करने के अलावा या उसके बजाय आक्रामक के रूप में झंडा लगाऊंगा। बस इतना ही।
कालेब

1
व्यक्तिगत रूप से मुझे लगता है कि पूरी तरह से अनंत छोरों के लिए पूरी तरह से एक और वाक्यविन्यास करने के लिए यहां एक वास्तविक अवसर है: कुछwheeeeeeee { ... }
'40

जवाबों:


33

यह पीडीपी -11 पर पुरानी प्रोग्रामिंग प्रथाओं से एक पकड़-ओवर है (हां, मैंने कहा पुराना है )। यह एक एकल निर्देश को बचाने के लिए उपयोग किया जाता था, जो लूप को तेजी से चलाने के लिए उपयोगी था।

अतिरिक्त जानकारी के लिए निम्नलिखित देखें: http://www.flounder.com/exception.htm


3
ठीक वही है जो मैं ढूंढ रहा था। एक वास्तविक, वैध कारण है, लेकिन यह अब वैध नहीं है।
क्रिस कूडमोर

1
@chris Nnnope, आधुनिक संकलक कभी-कभी लूप की स्थिति में स्थिरांक का उपयोग करने के बारे में शिकायत करेंगे। यह विशुद्ध रूप से एक पकड़ नहीं है।
इज़काता

उससे कहीं ज्यादा है। मुझे याद है कि 1990 के शुरुआती दौर में यूनिक्स सिस्टम पर C लिखना और जबकि (सच) {} एक विकल्प नहीं था। कोई मानक बूलियन प्रकार नहीं था, लेकिन कई यूनिक्स प्रणालियों ने सी हेडर फ़ाइलों में अपने स्वयं को परिभाषित किया। स्मृति से कम से कम एक यूनिक्स विक्रेता ने TRUE को फ़ंक्शन रिटर्न को संसाधित करने के लिए शून्य सपोसिड के रूप में परिभाषित किया क्योंकि कन्वेंशन को सफलता पर शून्य वापस करना था, और सकारात्मक संख्याएं विफल थीं। इसका मतलब यह था कि जबकि (ट्रू) {} पोर्टेबल नहीं था।
माइकल शॉ

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

@Ptolemy: वैसे आप निश्चित रूप से लिख सकते हैं while(1) { }
एड एस।

10

उपयोग करते समय कुछ संकलक एक चेतावनी देंगे ( सशर्त अभिव्यक्ति की तरह कुछ स्थिर है ) while( 1 )लेकिन for( ; ; )इसके बारे में चेतावनी देने के लिए कुछ भी नहीं है। प्रोग्रामर चेतावनी के बिना कोड चाहते हैं, इसलिए वे संस्करण के लिए उपयोग करते हैं।


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

5

यह सी प्रोग्रामिंग से प्राप्त एक आदत है जहां एक बूलियन प्रकार नहीं है। जबकि (1) समतुल्य संभावित होगा लेकिन For (;) अक्सर उपयोग किया जाता है क्योंकि यह K & R में प्रदर्शित होता है यदि मुझे सही याद है। मुझे संदेह है कि वहाँ भी एक हार्डवेयर कारण था कहीं।


4
... संदेह है वहाँ था एक हार्डवेयर कारण ...
हारून McIver

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

3

के लिए (;) को "हमेशा के लिए" के रूप में पढ़ा जा सकता है जो कुछ "स्वाभाविक" से अधिक स्वाभाविक लगता है।


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

-2

मेरे द्वारा पूछे गए सभी अनुभवी प्रोग्रामर या की for(;;)तुलना में अधिक तेज़ी से पहचान सकते हैं ।while(true)while(1)


2
कोई भी प्रोग्रामर जो एक लानत के लायक है, तीनों को तुरंत पहचानने में सक्षम होना चाहिए। तीनों काफ़ी आम हैं कि जो कोई भी 5 मिनट से अधिक का कोड पढ़ने में बिताता है, उसने उनमें से प्रत्येक को कई बार देखा है।
cHao

1
अध्ययनों से पता चला है कि अनुभवी प्रोग्रामर :-) की for(;;)तुलना में 14ms तेजी से समझ सकते हैंwhile(1)
केविन क्लाइन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.