क्या break
कई नेस्टेड for
छोरों से बाहर निकलने के लिए फ़ंक्शन का उपयोग करना संभव है ?
यदि हां, तो आप यह करने के बारे में कैसे जाएंगे? क्या आप यह भी नियंत्रित कर सकते हैं कि कितने छोरों को break
बाहर निकालता है?
क्या break
कई नेस्टेड for
छोरों से बाहर निकलने के लिए फ़ंक्शन का उपयोग करना संभव है ?
यदि हां, तो आप यह करने के बारे में कैसे जाएंगे? क्या आप यह भी नियंत्रित कर सकते हैं कि कितने छोरों को break
बाहर निकालता है?
जवाबों:
AFAIK, C ++ नामकरण छोरों का समर्थन नहीं करता है, जैसे जावा और अन्य भाषाएं करते हैं। आप एक गोटो का उपयोग कर सकते हैं, या एक ध्वज मूल्य बना सकते हैं जो आप उपयोग करते हैं। प्रत्येक लूप के अंत में ध्वज के मूल्य की जांच करें। यदि यह सही पर सेट है, तो आप उस पुनरावृत्ति को तोड़ सकते हैं।
goto
सबसे अच्छा विकल्प है अगर एक का उपयोग करने के लिए डरो मत ।
goto
: खराब प्रोग्रामर, और व्यावहारिक प्रोग्रामर। पूर्व स्वयं व्याख्यात्मक हैं। उत्तरार्द्ध, जिसे आप फिट करेंगे यदि आप उन्हें अच्छी तरह से उपयोग करने के लिए चुनते हैं, तो तथाकथित "बुराई" अवधारणा का उपयोग करें जब यह (दो) बुराइयों से कम हो। इसे कुछ C ++ अवधारणाओं की बेहतर समझ के लिए पढ़ें, जिन्हें आपको समय-समय पर उपयोग करने की आवश्यकता हो सकती है (मैक्रोज़, गोटो, प्रीप्रोसेसर, सरणियाँ): parashift.com/c++-faq-lite/big-pureure.html#faq-6.15
goto
शायद ही कभी का उपयोग करना सबसे अच्छा विकल्प है। क्यों अपने स्वयं के कार्य में छोरों को नहीं रखा ( inline
, यदि आप गति के बारे में चिंतित हैं) और return
इससे?
नहीं, इसे किसी के साथ खराब मत करो break
। के उपयोग के लिए यह अंतिम शेष गढ़ है goto
।
लैम्ब्डा का उपयोग करके स्पष्ट उत्तर जोड़ने के लिए:
for (int i = 0; i < n1; ++i) {
[&] {
for (int j = 0; j < n2; ++j) {
for (int k = 0; k < n3; ++k) {
return; // yay we're breaking out of 2 loops here
}
}
}();
}
बेशक इस पैटर्न की एक निश्चित सीमाएँ हैं और जाहिर सी बात है C ++ 11 लेकिन मुझे लगता है कि यह काफी उपयोगी है।
नेस्टेड लूप से बाहर निकलने का एक अन्य तरीका यह है कि दोनों छोरों को एक अलग फ़ंक्शन में फैक्टर करें, और return
उस फ़ंक्शन से जब आप बाहर निकलना चाहते हैं।
बेशक, यह दूसरे तर्क को सामने लाता है कि क्या आपको कभी return
भी किसी फ़ंक्शन से अंत के अलावा कहीं और स्पष्ट रूप से मिलना चाहिए ।
continue_processing
) के साथ फंसे हुए फ़ंक्शन थे जो फ़ंक्शन में कोड के ब्लॉक के निष्पादन को और नीचे नियंत्रित करते थे।
ब्रेक केवल अंतरतम लूप से बाहर निकलेगा जिसमें यह होगा।
आप किसी भी संख्या में छोरों को तोड़ने के लिए गोटो का उपयोग कर सकते हैं ।
बेशक गोटो को अक्सर हानिकारक माना जाता है ।
क्या ब्रेक फंक्शन का उपयोग करना उचित है [...]?
ब्रेक और गोटो का उपयोग करना एक कार्यक्रम की शुद्धता के बारे में तर्क करना अधिक कठिन बना सकता है। इस पर चर्चा के लिए यहां देखें: दिज्क्स्त्र पागल नहीं था ।
break
या return
।
break
और return
इसका फायदा यह है goto
कि आपको एक लेबल के लिए शिकार करने की आवश्यकता नहीं है ताकि वे कहां जाएं। हां, नीचे वे कुछ प्रकार के हैं goto
, लेकिन एक बहुत ही प्रतिबंधित है। वे अप्रतिबंधित की तुलना में प्रोग्रामर के पैटर्न-मिलान मस्तिष्क द्वारा समझने में बहुत आसान हैं goto
। तो IMO वे बेहतर हैं।
goto
।
हालाँकि यह उत्तर पहले ही प्रस्तुत किया गया था, मुझे लगता है कि एक अच्छा तरीका निम्नलिखित है:
for(unsigned int z = 0; z < z_max; z++)
{
bool gotoMainLoop = false;
for(unsigned int y = 0; y < y_max && !gotoMainLoop; y++)
{
for(unsigned int x = 0; x < x_max && !gotoMainLoop; x++)
{
//do your stuff
if(condition)
gotoMainLoop = true;
}
}
}
gotoMainLoop
है क्योंकि हर चक्र की जाँच की जाती है
goto
कोर को अधिक पठनीय और बेहतर प्रदर्शन करता है।
इस बारे में कैसा है?
for(unsigned int i=0; i < 50; i++)
{
for(unsigned int j=0; j < 50; j++)
{
for(unsigned int k=0; k < 50; k++)
{
//Some statement
if (condition)
{
j=50;
k=50;
}
}
}
}
एक कोड उदाहरण का उपयोग कर goto
और एक नेस्टेड लूप से बाहर निकलने के लिए एक लेबल:
for (;;)
for (;;)
goto theEnd;
theEnd:
कई नेस्टेड छोरों को तोड़ने का एक अच्छा तरीका है कि आप किसी फ़ंक्शन में अपने कोड को रिफलेक्टर करें:
void foo()
{
for(unsigned int i=0; i < 50; i++)
{
for(unsigned int j=0; j < 50; j++)
{
for(unsigned int k=0; k < 50; k++)
{
// If condition is true
return;
}
}
}
}
नेस्टेड छोरों को तोड़ने के लिए गोटो बहुत मददगार हो सकता है
for (i = 0; i < 1000; i++) {
for (j = 0; j < 1000; j++) {
for (k = 0; k < 1000; k++) {
for (l = 0; l < 1000; l++){
....
if (condition)
goto break_me_here;
....
}
}
}
}
break_me_here:
// Statements to be executed after code breaks at if condition
मुझे लगता है कि goto
इस परिस्थिति में मान्य है:
एक अनुकरण करने के लिए break
/ continue
, आप चाहते हैं चाहते हैं:
for ( ; ; ) {
for ( ; ; ) {
/*Code here*/
if (condition) {
goto theEnd;
}
}
}
theEnd:
for ( ; ; ) {
for ( ; ; ) {
/*Code here*/
if (condition) {
i++;
goto multiCont;
}
}
multiCont:
}
i
। इसलिए i++
गोटो से पहले
PHP जैसी अन्य भाषाएं ब्रेक के लिए एक पैरामीटर स्वीकार करती हैं (यानी ब्रेक 2;) नेस्टेड लूप स्तर की मात्रा को निर्दिष्ट करने के लिए जिसे आप बाहर तोड़ना चाहते हैं, सी ++ हालांकि नहीं करता है। आपको बूलियन का उपयोग करके इसे काम करना होगा जिसे आपने लूप से पहले गलत सेट किया था, लूप में सही पर सेट करें यदि आप तोड़ना चाहते हैं, तो नेस्टेड लूप के बाद एक सशर्त ब्रेक, चेक करना कि क्या बूलियन को सही पर सेट किया गया था और अगर हाँ
मुझे पता है यह पुरानी पोस्ट है। लेकिन मैं थोड़ा तार्किक और सरल उत्तर देना चाहूंगा।
for(unsigned int i=0; i < 50; i++)
{
for(unsigned int j=0; j < conditionj; j++)
{
for(unsigned int k=0; k< conditionk ; k++)
{
// If condition is true
j= conditionj;
break;
}
}
}
j = conditionj
यदि आप इसके बजाय एक जटिल विधेय है, तो यह बहुत स्केलेबल समाधान नहीं होगा j < conditionj
।
bool
नीचे दिए गए केवल एक चर से किसी भी संख्या में छोरों को तोड़ें :
bool check = true;
for (unsigned int i = 0; i < 50; i++)
{
for (unsigned int j = 0; j < 50; j++)
{
for (unsigned int k = 0; k < 50; k++)
{
//Some statement
if (condition)
{
check = false;
break;
}
}
if (!check)
{
break;
}
}
if (!check)
{
break;
}
}
इस कोड में हम break;
सभी छोरों।
मुझे यकीन नहीं है अगर यह इसके लायक है, लेकिन आप कुछ सरल मैक्रोज़ के साथ जावा के नामित लूप का अनुकरण कर सकते हैं:
#define LOOP_NAME(name) \
if ([[maybe_unused]] constexpr bool _namedloop_InvalidBreakOrContinue = false) \
{ \
[[maybe_unused]] CAT(_namedloop_break_,name): break; \
[[maybe_unused]] CAT(_namedloop_continue_,name): continue; \
} \
else
#define BREAK(name) goto CAT(_namedloop_break_,name)
#define CONTINUE(name) goto CAT(_namedloop_continue_,name)
#define CAT(x,y) CAT_(x,y)
#define CAT_(x,y) x##y
उदाहरण का उपयोग:
#include <iostream>
int main()
{
// Prints:
// 0 0
// 0 1
// 0 2
// 1 0
// 1 1
for (int i = 0; i < 3; i++) LOOP_NAME(foo)
{
for (int j = 0; j < 3; j++)
{
std::cout << i << ' ' << j << '\n';
if (i == 1 && j == 1)
BREAK(foo);
}
}
}
एक और उदाहरण:
#include <iostream>
int main()
{
// Prints:
// 0
// 1
// 0
// 1
// 0
// 1
int count = 3;
do LOOP_NAME(foo)
{
for (int j = 0; j < 3; j++)
{
std::cout << ' ' << j << '\n';
if (j == 1)
CONTINUE(foo);
}
}
while(count-- > 1);
}
आप कोशिश ... पकड़ का उपयोग कर सकते हैं।
try {
for(int i=0; i<10; ++i) {
for(int j=0; j<10; ++j) {
if(i*j == 42)
throw 0; // this is something like "break 2"
}
}
}
catch(int e) {} // just do nothing
// just continue with other code
यदि आपको एक साथ कई लूप्स को तोड़ना है, तो यह अक्सर एक अपवाद है।
फ़ोर-लूप से बाहर निकलना मेरे लिए थोड़ा अजीब है, क्योंकि फ़ोर-लूप के शब्दार्थ आमतौर पर संकेत देते हैं कि यह निर्दिष्ट समय को निष्पादित करेगा। हालाँकि, यह सभी मामलों में बुरा नहीं है; यदि आप किसी संग्रह में कुछ खोज रहे हैं और उसे खोजने के बाद उसे तोड़ना चाहते हैं, तो यह उपयोगी है। नेस्टेड छोरों से बाहर निकलना, हालांकि, सी ++ में संभव नहीं है; यह लेबल विराम के उपयोग के माध्यम से अन्य भाषाओं में है। आप एक लेबल और एक गोटो का उपयोग कर सकते हैं, लेकिन यह आपको रात में नाराज़गी दे सकता है ..? हालांकि सबसे अच्छा विकल्प लगता है।