break
বেশ কয়েকটি নেস্টেড for
লুপগুলি থেকে বেরিয়ে আসার জন্য কী ফাংশনটি ব্যবহার করা সম্ভব ?
যদি তা হয় তবে আপনি কীভাবে এটি চালিয়ে যাবেন? আপনি কতগুলি লুপগুলি break
প্রস্থান করে তাও নিয়ন্ত্রণ করতে পারেন ?
break
বেশ কয়েকটি নেস্টেড for
লুপগুলি থেকে বেরিয়ে আসার জন্য কী ফাংশনটি ব্যবহার করা সম্ভব ?
যদি তা হয় তবে আপনি কীভাবে এটি চালিয়ে যাবেন? আপনি কতগুলি লুপগুলি break
প্রস্থান করে তাও নিয়ন্ত্রণ করতে পারেন ?
উত্তর:
আফাইক, সি ++ জাভা এবং অন্যান্য ভাষার মতো নামকরণ লুপগুলিকে সমর্থন করে না। আপনি একটি গোটো ব্যবহার করতে পারেন বা আপনি যে পতাকা ব্যবহার করছেন তা তৈরি করতে পারেন। প্রতিটি লুপের শেষে পতাকাটির মানটি পরীক্ষা করুন। যদি এটি সত্যতে সেট করা থাকে, তবে আপনি সেই পুনরাবৃত্তিটি ভেঙে ফেলতে পারেন।
goto
এটি সর্বোত্তম বিকল্প হলে কোনওটি ব্যবহার করতে ভয় পাবেন না ।
goto
: খারাপ প্রোগ্রামার এবং প্র্যাকমেটিক প্রোগ্রামার। প্রাক্তন স্ব স্ব বর্ণনাকারী। পরেরটি, আপনি যদি এগুলি ভালভাবে ব্যবহার করতে চান তবে আপনি এটিতে উপযুক্ত হয়ে উঠবেন, যখন এটি (দু'টি মন্দ) কম হয় তখন তথাকথিত "অশুভ" ধারণাটি ব্যবহার করুন। এমন কিছু সি ++ ধারণা সম্পর্কে আরও ভাল বোঝার জন্য এটি পড়ুন যা আপনাকে সময়ে সময়ে ব্যবহারের প্রয়োজন হতে পারে (ম্যাক্রোস, গোটোস
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
}
}
}();
}
অবশ্যই এই প্যাটার্নটির একটি নির্দিষ্ট সীমাবদ্ধতা রয়েছে এবং স্পষ্টতই কেবল সি ++ 11 তবে আমি মনে করি এটি বেশ কার্যকর।
নেস্টেড লুপটি ভেঙে ফেলার আরেকটি পদ্ধতি হ'ল উভয় লুপকে আলাদা ফাংশনে ফ্যাক্ট করা এবং return
সেই ফাংশন থেকে যখন আপনি প্রস্থান করতে চান।
অবশ্যই, এটি অন্য যুক্তিটি সামনে এনেছে যে আপনার return
শেষে কখনও ব্যতীত অন্য কোনও অনুষ্ঠান থেকে স্পষ্টভাবে হওয়া উচিত কিনা ।
continue_processing
) দিয়ে ফাংশনগুলি ফাঁকা ছিল এমন একটি সিস্টেমে আমি কাজ করেছি যা ফাংশনে কোডের ব্লকগুলির সম্পাদনকে আরও নিচে নিয়ন্ত্রণ করে।
বিরতি এটিতে অন্তর্ভুক্ত কেবলমাত্র অন্তরের লুপটি প্রস্থান করবে।
আপনি যেকোন সংখ্যক লুপ ভেঙে ফেলার জন্য গোটো ব্যবহার করতে পারেন ।
অবশ্যই গোটো প্রায়শই ক্ষতিকারক হিসাবে বিবেচিত হয় ।
ব্রেক ফাংশনটি ব্যবহার করা কি যথাযথ [...]?
বিরতি এবং গোটো ব্যবহার করে কোনও প্রোগ্রামের যথার্থতার বিষয়ে যুক্তি আরো জটিল করে তুলতে পারে। এটি সম্পর্কে একটি আলোচনার জন্য এখানে দেখুন: ডিজকস্ট্রা উন্মাদ ছিল না ।
break
বা সুপারিশ করা উচিত return
।
break
এবং এর return
চেয়ে সুবিধা হ'ল goto
আপনার কোথায় লেবেল রয়েছে তা অনুসন্ধান করার জন্য আপনাকে কোনও লেবেল অনুসন্ধান করার দরকার নেই। হ্যাঁ, নীচে এগুলি একরকম goto
, তবে খুব সীমাবদ্ধ। কোনও প্রোগ্রামার প্যাটার্ন-ম্যাচিং মস্তিস্ককে বাধা না বাড়ানোর চেয়ে এগুলি বোঝা অনেক সহজ goto
। সুতরাং আইএমও তারা পছন্দসই।
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++
এতে যান সামনে
অন্যান্য ভাষা যেমন পিএইচপি ব্রেক করার জন্য একটি প্যারামিটার গ্রহণ করে (অর্থাত্ ব্রেক 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
যদি আপনাকে একবারে কয়েকটি লুপ ভেঙে দিতে হয় তবে এটি প্রায়শই যাই হোক ব্যতিক্রম।
ফোর-লুপটি ভাঙ্গা আমার কাছে কিছুটা অদ্ভুত, কারণ ফোর-লুপের শব্দার্থক শব্দগুলি সাধারণত ইঙ্গিত করে যে এটি একটি নির্দিষ্ট সংখ্যক সময় কার্যকর করবে। তবে, এটি সব ক্ষেত্রেই খারাপ নয়; আপনি যদি কোনও সংগ্রহে কিছু সন্ধান করে থাকেন এবং এটি খুঁজে পাওয়ার পরে ভাঙতে চান, এটি দরকারী। নেস্টেড লুপগুলি ছিন্ন করা, তবে, সি ++ এ সম্ভব নয়; এটি অন্যান্য ভাষায় লেবেলযুক্ত বিরতি ব্যবহারের মাধ্যমে হয়। আপনি একটি লেবেল এবং একটি গোটো ব্যবহার করতে পারেন, তবে এটি আপনাকে রাতের বেলা জ্বলতে পারে ..? যদিও সেরা বিকল্প হিসাবে মনে হচ্ছে।