दिलचस्प पोस्ट
पीडीओ :: पंक्तिकाउंट वीएस COUNT (*) c ++ getline () कंसोल से इनपुट के लिए इंतजार नहीं कर रहा है, जिसे कई बार कहा जाता है एंड्रॉइड में एकाधिक स्टेटसबार सूचनाएं कैसे बनाएं कैसे जावास्क्रिप्ट में तारीख अंतर की गणना करने के लिए Com.sun पैकेज के अंदर क्या है? Django बहु-चयन विजेट? ओरेकल पर AUTO_INCREMENT के साथ आईडी कैसे बनाऊँ? बाइनरी के लिए पायथन int? "पार्स त्रुटि: एंड्रॉइड एप्लिकेशन इंस्टॉल करते समय पैकेज को पार्स करने में कोई समस्या है" कैसे सुपरफ़िश ड्रॉपडाउन मेनू उत्तरदायी बनाने के लिए? मैं आरजीबी में 2 डी सरणी के रूप में छवि पिक्सेल के मान कैसे पढ़ सकता हूं? JQuery के साथ <img /> के स्रोत को रीफ्रेश करने के लिए कैसे? एक MySQL तालिका, अनुक्रमित और डेटा को डुप्लिकेट करना सेलेनियम 2.0 बी 3 IE वेबड्राइवर, फ़ायरिंग नहीं पर क्लिक करें संकलित निष्पादन योग्य से कंपाइलर विकल्प प्राप्त करें?

सी या सी ++ में अच्छे मिलन के उदाहरण

इस धागे में, हम ग या सी ++ में goto के अच्छे उपयोगों के उदाहरणों को देखते हैं। यह एक ऐसे जवाब से प्रेरित है , जिसे लोगों ने वोट दिया क्योंकि उन्हें लगा कि मैं मजाक कर रहा था।

सारांश (मूल से बदल दिया गया लेबल भी स्पष्ट बनाने के लिए):

 infinite_loop: // code goes here goto infinite_loop; 

यह विकल्पों से बेहतर क्यों है:

  • यह विशिष्ट है goto भाषा निर्माण है जो बिना शर्त शाखा का कारण बनता है। वैकल्पिक सशर्त शाखाओं का समर्थन करने वाले ढांचे का उपयोग करने पर विकल्प निर्भर होते हैं, साथ-साथ हमेशा-हमेशा की हालत बिगड़ती जाती है।
  • लेबल अतिरिक्त टिप्पणियों के बिना आशय का दस्तावेजीकरण करता है।
  • पाठक को प्रारंभिक break के लिए इंटरवेनिंग कोड को स्कैन करने की ज़रूरत नहीं है (हालांकि यह अभी तक एक अनपेक्षित हैकर के लिए संभव है जिसे प्रारंभिक goto साथ continue लिए अनुकरण continue संभव है)।

नियम:

  • नाटक दिखाओ कि गायोफोब जीत नहीं पाये। यह समझ गया है कि ऊपर का इस्तेमाल वास्तविक कोड में नहीं किया जा सकता क्योंकि यह स्थापित मुहावरों के खिलाफ है
  • मान लें कि हम सभी को 'गोटो को हानिकारक माना जाता है' के बारे में सुना है और पता है कि गोटो स्पेगेटी कोड लिखने के लिए इस्तेमाल किया जा सकता है।
  • यदि आप किसी उदाहरण से असहमत हैं, तो इसे तकनीकी योग्यता पर अकेले आलोचना करें ('क्योंकि लोगों को गोटो पसंद नहीं है' तकनीकी कारण नहीं है)।

चलो देखते हैं कि हम इस तरह के बड़े अप के बारे में बात कर सकते हैं।

संपादित करें

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

अन्य प्रतिक्रियाओं को ध्यान में रखते हुए, मैं देखता हूं कि बहुत से लोग goto को उस चीज़ के रूप में देखते हैं जो आपको किसी अन्य तरीके से फिर से लिखना है। बेशक आप एक पाश, एक अतिरिक्त ध्वज, नीडि़त का एक स्टैक, या जो कुछ भी शुरू कर एक goto से बच सकते हैं, लेकिन क्यों नहीं goto शायद नौकरी के लिए सबसे अच्छा उपकरण है? एक और तरीका रखो, लोगों को कितनी कुंठितता का सामना करने के लिए तैयार किया गया है, जिसका उद्देश्य इसके उद्देश्य से एक अंतर्निहित भाषा का उपयोग करने से बचने के लिए है? मेरा लेना यह है कि यहां तक ​​कि एक झंडा भी जोड़ने के लिए कीमत बहुत अधिक है। मुझे समस्या या हल डोमेन में चीजों का प्रतिनिधित्व करने के लिए मेरी वैरिएबल पसंद है I 'केवल एक goto से बचने के लिए' यह कटौती नहीं करता है

मैं पहला जवाब स्वीकार करता हूं जिसने एक क्लीनअप ब्लॉक में शाखाओं के लिए सी पैटर्न दिया था। आईएमओ, यह सभी पोस्ट किए गए उत्तरों के एक goto के लिए सबसे मजबूत मामला बना लेता है, निश्चित रूप से यदि आप इसे प्रतिद्वंद्वियों द्वारा मापते हैं तो किसी नफरत को इससे बचने के लिए जाना पड़ता है।

Solutions Collecting From Web of "सी या सी ++ में अच्छे मिलन के उदाहरण"

ये एक चाल है जो मैंने लोगों के बारे में सुना है। मैंने हालांकि इसे जंगली में कभी नहीं देखा है। और यह केवल सी पर लागू होता है क्योंकि सी ++ ने आरएआईआई को और अधिक मुहावरेदार तरीके से करने के लिए किया है।

 void foo() { if (!doA()) goto exit; if (!doB()) goto cleanupA; if (!doC()) goto cleanupB; /* everything has succeeded */ return; cleanupB: undoB(); cleanupA: undoA(); exit: return; } 

गोटो में सी के लिए क्लासिक आवश्यकता इस प्रकार है

 for ... for ... if(breakout_condition) goto final; final: 

नेस्टेड लूपों को एक गोटो के बिना बाहर तोड़ने का कोई सीधा तरीका नहीं है

यूनिक्स सिस्टम कॉल्स के लिए यहां मेरा गैर-मूर्खतापूर्ण उदाहरण है, (स्टीवन्स एपिटू से) जो कि संकेत द्वारा बाधित हो सकता है

 restart: if (system_call() == -1) { if (errno == EINTR) goto restart; // handle real errors } 

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

यदि डफ के डिवाइस को एक गोटो की आवश्यकता नहीं है, तो आपको भी नहीं चाहिए! 😉

 void dsend(int count) { int n; if (!count) return; n = (count + 7) / 8; switch (count % 8) { case 0: do { puts("case 0"); case 7: puts("case 7"); case 6: puts("case 6"); case 5: puts("case 5"); case 4: puts("case 4"); case 3: puts("case 3"); case 2: puts("case 2"); case 1: puts("case 1"); } while (--n > 0); } } 

विकिपीडिया प्रविष्टि से ऊपर कोड

नुथ ने एक पत्र लिखा है "GOTO स्टेटमेंट्स के साथ स्ट्रक्चर्ड प्रोग्रामिंग", आप इसे यहां से प्राप्त कर सकते हैं । आपको वहां कई उदाहरण मिलेंगे

बहुत ही आम।

 do_stuff(thingy) { lock(thingy); foo; if (foo failed) { status = -EFOO; goto OUT; } bar; if (bar failed) { status = -EBAR; goto OUT; } do_stuff_to(thingy); OUT: unlock(thingy); return status; } 

एकमात्र मामला जो मैं कभी भी goto का उपयोग करता हूं, आगे चलने के लिए है, आमतौर पर ब्लॉक से बाहर, और कभी भी ब्लॉकों में नहीं। यह do{}while(0) और अन्य निर्माणों का दुरुपयोग से बचा जाता है जो नेस्टिंग में वृद्धि करते हैं, जबकि अभी भी पठनीय, संरचित कोड बनाए रखते हैं।

मेरे पास आम तौर पर आइटी के खिलाफ कुछ नहीं है, लेकिन मैं कई कारणों के बारे में सोच सकता हूं कि आप उन लोगों का उपयोग क्यों नहीं करना चाहते हैं जैसे आपने एक लूप का उल्लेख किया है:

  • यह दायरे को सीमित नहीं करता है इसलिए आप किसी भी अस्थायी चर का उपयोग करते हैं जो बाद में तब तक मुक्त नहीं होगा।
  • यह दायरे को सीमित नहीं करता है इसलिए यह बग तक पहुंच सकता है।
  • यह दायरे को सीमित नहीं करता है इसलिए आप उसी चर नामों में भविष्य के कोड में फिर से उपयोग नहीं कर सकते हैं।
  • यह दायरे को सीमित नहीं करता है इसलिए आपके पास एक परिवर्तनीय घोषणा को छोड़ने का मौका है।
  • लोग इसे करने के लिए आदी नहीं हैं और यह आपके कोड को पढ़ने के लिए कठिन बना देगा।
  • इस प्रकार की नेस्टेड छोरें स्पेगेटी कोड का कारण बन सकती हैं, नॉर्मल लूप स्पगेटी कोड से आगे नहीं बढ़ेंगे।

गोटो का उपयोग करने के लिए एक अच्छी जगह एक ऐसी प्रक्रिया है जो कई बिंदुओं पर रोक सकती है, जिनमें से प्रत्येक को सफाई के विभिन्न स्तरों की आवश्यकता होती है। गोटोफ़ोब्स, संरक्षित कोड और परीक्षणों की एक श्रृंखला के साथ मिलकर हमेशा से प्रतिस्थापित कर सकते हैं, लेकिन मुझे लगता है कि यह अधिक सरल है क्योंकि यह अत्यधिक खरोज को समाप्त करता है:

 अगर (! ओपनडेटाफ़ाइल ())
   गोटो छोड़ने;

 अगर (! getDataFromFile ())
   गोटो क्लोजफ़ाइल एंडक्विट;

 अगर (! आवंटित कुछ स्रोतों)
   गोटो फ्री संसाधनसूचियांऔरकुछ;

 // यहां अधिक काम करें ....

 freeResourcesAndQuit:
    // मुक्त संसाधन
 closeFileAndQuit:
    // बंद फाइल
 छोड़ने:
    // छोड़ो!

@ फ़िसर। मैपेनआईड.कॉम: आपका पोस्ट कोड स्निपेट निम्नलिखित के बराबर है:

  while (system_call() == -1) { if (errno != EINTR) { // handle real errors break; } } 

मैं निश्चित रूप से इस फॉर्म को पसंद करता हूं।

हालांकि मुझे समय के साथ इस पद्धति से नफरत करने के लिए उगाया गया है, यह कॉम प्रोग्रामिंग में अंतर्निहित है

 #define IfFailGo(x) {hr = (x); if (FAILED(hr)) goto Error} ... HRESULT SomeMethod(IFoo* pFoo) { HRESULT hr = S_OK; IfFailGo( pFoo->PerformAction() ); IfFailGo( pFoo->SomeOtherAction() ); Error: return hr; } 

यहां एक अच्छा गोटो का एक उदाहरण है:

 // No Code 

मैंने गोटो को सही तरीके से इस्तेमाल किया है लेकिन हालात सामान्य रूप से बदसूरत हैं यह केवल तब होता है जब goto का प्रयोग मूल से बहुत कम है। @ जोनाथन हॉलैंड, पोबल है आप का संस्करण कम स्पष्ट है। लोगों को स्थानीय चर से डर लगता है:

 void foo() { bool doAsuccess = doA(); bool doBsuccess = doAsuccess && doB(); bool doCsuccess = doBsuccess && doC(); if (!doCsuccess) { if (doBsuccess) undoB(); if (doAsuccess) undoA(); } } 

और मैं इस तरह लूपों को पसंद करता हूं लेकिन कुछ लोग पसंद while(true)

 for (;;) { //code goes here } 

इस बारे में मेरी शिकायत है कि आप ब्लॉक स्कोपिंग खो देते हैं; यदि किसी भी स्थानीय चर को घोषित किया गया है, तो गोटो के बीच घोषित किया जाता है, यदि लूप कभी भी समाप्त हो गया है। (शायद आप मान रहे हैं कि लूप हमेशा से चलता रहता है, मुझे नहीं लगता कि मूल प्रश्न लेखक क्या पूछ रहा था।)

Scoping की समस्या C ++ के साथ एक समस्या के अधिक है, क्योंकि कुछ ऑब्जेक्ट उनके dtor के आधार पर हो सकता है उचित समय पर बुलाया जा रहा है।

मेरे लिए, गोटो का उपयोग करने का सबसे अच्छा कारण बहु-चरण प्रारंभिक प्रक्रिया के दौरान होता है, जहां यह महत्वपूर्ण है कि यदि कोई असफल हो, तो सभी इनिटों का समर्थन किया जाता है, एक ला:

 if(!foo_init()) goto bye; if(!bar_init()) goto foo_bye; if(!xyzzy_init()) goto bar_bye; return TRUE; bar_bye: bar_terminate(); foo_bye: foo_terminate(); bye: return FALSE; 

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

 #include <stdio.h> #include <string.h> int main() { char name[64]; char url[80]; /*The final url name with http://www..com*/ char *pName; int x; pName = name; INPUT: printf("\nWrite the name of a web page (Without www, http, .com) "); gets(name); for(x=0;x<=(strlen(name));x++) if(*(pName+0) == '\0' || *(pName+x) == ' ') { printf("Name blank or with spaces!"); getch(); system("cls"); goto INPUT; } strcpy(url,"http://www."); strcat(url,name); strcat(url,".com"); printf("%s",url); return(0); } 

@Greg:

ऐसा क्यों नहीं करते तुम्हारा उदाहरण:

 void foo() { if (doA()) { if (doB()) { if (!doC()) { UndoA(); UndoB(); } } else { UndoA(); } } return; }