একটি সুইচের অভ্যন্তর থেকে কীভাবে লুপটি ভেঙে যায়?


113

আমি এমন কিছু কোড লিখছি যা দেখে মনে হচ্ছে:

while(true) {
    switch(msg->state) {
    case MSGTYPE: // ... 
        break;
    // ... more stuff ...
    case DONE:
        break; // **HERE, I want to break out of the loop itself**
    }
}

এটি করার কোনও প্রত্যক্ষ উপায় আছে কি?

আমি জানি আমি একটি পতাকা ব্যবহার করতে পারি, এবং সুইচের ঠিক পরে শর্তাধীন বিরতি রেখে লুপ থেকে বিরতিতে পারি। আমি কেবল জানতে চাই যে ইতিমধ্যে এর জন্য সি ++ এর কিছু গঠন রয়েছে কিনা।


20
স্যুইচ করার পরে আপনার শর্তসাপেক্ষ বিরতি কেন দরকার? আপনার সময়টি (সত্য) থেকে কিছুক্ষণ (পতাকা) থেকে বদলে দিন ...
তাল প্রেসম্যান

7
@ ডেভ_জার্ভিস আমি ধরে নিয়েছি যে এটি একটি সরল সংস্করণ যা তিনি এখানে চেষ্টা করেছিলেন যা তিনি করার চেষ্টা করছেন তা চিত্রিত করার জন্য।
Alter Life

6
আপনি যদি এই প্রোগ্রামারগুলির মধ্যে অন্যতম হন যা বেশ কয়েকটি পৃষ্ঠাগুলির দীর্ঘ ফাংশন তৈরি করে তবে আপনি gotoআকর্ষণীয় এবং কখনও কখনও একমাত্র পরিষ্কার উপায় খুঁজে পাবেন। আপনি যদি নিজের কোডটি ছোট ফাংশনগুলিতে সংগঠিত করেন যা কেবল কয়েকটি লাইন দীর্ঘ এবং প্রতিটি একক কাজ করে, আপনি কখনই এই সমস্যায় পড়বেন না। (ঘটনাচক্রে আপনার কোডটি পড়াও সহজ হবে))
এসবিআই

13
যদি আপনি ধূমপান ত্যাগ করার পরামর্শ পাওয়ার মতো মনে করেন তবে আপনার কাছে জানতে চান যে কীভাবে নিকটস্থ সাবওয়ে স্টেশনে যাবেন।
মাইকেল ক্রেলিন - হ্যাকার

7
@ হ্যাকার: আচ্ছা, সমস্ত ধূমপানের কারণে আপনি যদি পাতাল রেল স্টেশনটি আপনার সামনে দেখতে না পান, তবে পরামর্শটি এত খারাপ নাও হতে পারে। :)
এসবিআই

উত্তর:


49

প্রতিজ্ঞা

নিম্নলিখিত কোডটি ভাষা বা পছন্দসই কার্যকারিতা নির্বিশেষে খারাপ ফর্ম হিসাবে বিবেচনা করা উচিত:

while( true ) {
}

সমর্থন যুক্তি

while( true )লুপ কারণ এটি দরিদ্র ফর্ম হল:

  • কিছুক্ষণ লুপের অন্তর্নিহিত চুক্তিটি ভঙ্গ করে।
    • লুপ ঘোষণায় স্পষ্টভাবে একমাত্র প্রস্থান শর্তটি বলা উচিত।
  • বোঝায় যে এটি চিরতরে লুপ করে।
    • সমাপ্তির ধারাটি বুঝতে লুপের মধ্যে কোড অবশ্যই পড়তে হবে।
    • লুপগুলি যে চিরতরে পুনরাবৃত্তি হয় ব্যবহারকারীকে প্রোগ্রামের মধ্যে থেকে প্রোগ্রামটি শেষ করতে বাধা দেয়।
  • অদক্ষ।
    • "সত্য" এর জন্য পরীক্ষা করা সহ একাধিক লুপ সমাপ্তির শর্ত রয়েছে।
  • বাগ প্রবণ হয়।
    • সর্বদা প্রতিটি পুনরাবৃত্তির জন্য কার্যকর করা হবে এমন কোডটি কোথায় স্থাপন করা যায় তা সহজেই নির্ধারণ করা যায় না।
  • অহেতুক জটিল কোড বাড়ে।
  • স্বয়ংক্রিয় উত্স কোড বিশ্লেষণ।
    • বাগ অনুসন্ধানের জন্য, প্রোগ্রামের জটিলতা বিশ্লেষণ, সুরক্ষা চেকগুলি, বা কোড প্রয়োগের ছাড়াই স্বয়ংক্রিয়ভাবে অন্য কোনও উত্স কোড আচরণ সঞ্চার করে, প্রাথমিক ব্রেকিং শর্ত (গুলি) এলগোরিদমগুলিকে দরকারী আক্রমণকারী নির্ধারণ করার অনুমতি দেয়, যার ফলে স্বয়ংক্রিয় উত্স কোড বিশ্লেষণ মেট্রিকগুলি উন্নত হয়।
  • অসীম লুপস।
    • প্রত্যেকে যদি সর্বদা while(true)লুপগুলির জন্য ব্যবহার করে যা অসীম নয়, লুপগুলির আসলে কোন সমাপ্তির শর্ত না থাকে তখন আমরা সংক্ষিপ্তভাবে যোগাযোগের ক্ষমতা হারাতে পারি। (যুক্তিযুক্তভাবে, এটি ইতিমধ্যে ঘটেছে, সুতরাং বিন্দুটি মোটা)

"যান" বিকল্প

নিম্নলিখিত কোডটি আরও ভাল ফর্ম:

while( isValidState() ) {
  execute();
}

bool isValidState() {
  return msg->state != DONE;
}

সুবিধাদি

কোন পতাকা নেই। কোন goto। বিকল্প নেই. পরিবর্তন সহজ। পড়তে সহজ. ঠিক করা সহজ। অতিরিক্তভাবে কোড:

  1. লুপ থেকে নিজেই লুপের কাজের চাপের জ্ঞানকে বিচ্ছিন্ন করে।
  2. কোড বজায় রাখা কাউকে সহজে কার্যকারিতা বাড়ানোর অনুমতি দেয়।
  3. একাধিক অবসান শর্তাবলী এক জায়গায় বরাদ্দ করার অনুমতি দেয়।
  4. কার্যকর করতে কোড থেকে সমাপ্তি ধারাটি পৃথক করে।
  5. পারমাণবিক বিদ্যুৎ কেন্দ্রের পক্ষে নিরাপদ। ;-)

দ্বিতীয় বিষয়টি গুরুত্বপূর্ণ। কোডটি কীভাবে কাজ করে তা না জেনে যদি কেউ আমাকে মূল লুপ তৈরি করতে বলে অন্য থ্রেডগুলিতে (বা প্রক্রিয়াগুলি) কিছুটা সিপিইউ সময় দেয়, দুটি সমাধান মাথায় আসে:

বিকল্প 1

সহজেই বিরতি sertোকান:

while( isValidState() ) {
  execute();
  sleep();
}

বিকল্প # 2

ওভাররাইড এক্সিকিউট:

void execute() {
  super->execute();
  sleep();
}

এই কোড একটি লুপ চেয়ে (অথবা পড়ার জন্য সহজ এইভাবে) সহজ একটি এমবেডেড সাথে আছেন switchisValidStateপদ্ধতিটি কেবল নির্ধারণ উচিত লুপ চালিয়ে যাওয়া উচিত। পদ্ধতির ওয়ার্কহর্সটি পদ্ধতিতে বিমূর্ত হওয়া উচিত execute, যা সাবক্লাসগুলি ডিফল্ট আচরণকে (একটি এম্বেডড switchএবং ব্যবহার করে একটি কঠিন কাজ goto) ওভাররাইড করতে দেয় ।

পাইথন উদাহরণ

স্ট্যাকওভারফ্লোতে পোস্ট করা নিম্নলিখিত উত্তরটির (একটি পাইথন প্রশ্নের কাছে) তুলনা করুন:

  1. চিরকালের জন্য লুপ।
  2. ব্যবহারকারীকে তাদের পছন্দটি ইনপুট করতে বলুন।
  3. যদি ব্যবহারকারীর ইনপুটটি 'পুনঃসূচনা' হয় তবে চিরকালের জন্য লুপিং চালিয়ে যান।
  4. অন্যথায়, চিরতরে লুপিং বন্ধ করুন।
  5. শেষ.
কোড
while True: 
    choice = raw_input('What do you want? ')

    if choice == 'restart':
        continue
    else:
        break

print 'Break!' 

বনাম:

  1. ব্যবহারকারীর পছন্দ শুরু করুন।
  2. লুপটি যখন ব্যবহারকারীর পছন্দের শব্দটি 'পুনঃসূচনা' হয়।
  3. ব্যবহারকারীকে তাদের পছন্দটি ইনপুট করতে বলুন।
  4. শেষ.
কোড
choice = 'restart';

while choice == 'restart': 
    choice = raw_input('What do you want? ')

print 'Break!'

এখানে while Trueবিভ্রান্তিকর এবং অত্যধিক জটিল কোডের ফলাফল।


45
while(true)ক্ষতিকারক ধারণাটি আমার কাছে উদ্ভট বলে মনে হয়। লুপ রয়েছে যা কার্যকর করার আগে এটি পরীক্ষা করে, সেখানে যা পরে তা পরীক্ষা করে এবং মাঝখানে যা চেক করে। যেহেতু পরের সি এবং সি ++ তে সিনট্যাকটিক কনস্ট্রাক্ট নেই, আপনাকে while(true)বা ব্যবহার করতে হবে for(;;)। আপনি যদি এটিকে ভুল বিবেচনা করেন তবে আপনি এখনও বিভিন্ন ধরণের লুপগুলিতে যথেষ্ট চিন্তা করেননি।
এসবিআই

34
যে কারণে আমি একমত নই: কারণ (সত্য) এবং (;;;) এর জন্য বিভ্রান্তিকর নয় (যখন (সত্য)) এর বিপরীতে নয় কারণ তারা জানায় যে তারা ঠিক সামনে কী করছে। একটি বিরতিপূর্ণ লুপ শর্তটি পার্স করার চেয়ে "বিরতি" বিবৃতি সন্ধান করা এবং এটি কোথায় সেট করা হয়েছে তা অনুসন্ধান করা এবং যথার্থতা প্রমাণ করার পক্ষে আর কঠিন নয় actually কোডটি কোথায় রাখবেন সে সম্পর্কে তর্কটি একটি চালিয়ে যাওয়া বিবৃতিটির উপস্থিতিতে ঠিক ততটুকুই ইন্টারেক্টেবল এবং যদি বিবৃতি দিয়ে থাকে তবে তার চেয়ে বেশি ভাল নয়। দক্ষতার যুক্তিটি ইতিবাচকভাবে নির্বোধ।
ডেভিড থর্নলি

23
আপনি যখনই "সত্য (সত্য)" দেখেন, আপনি এমন একটি লুপের কথা ভাবতে পারেন যা অভ্যন্তরীণ সমাপ্তির শর্তাবলী করে, যা নির্বিচারে শেষের শর্তগুলির চেয়ে কঠিন নয়। সহজভাবে, একটি "ওয়েল (ফু)" লুপ, যেখানে ফু একটি স্বেচ্ছাসেবী পদ্ধতিতে বুলিয়ান চলক সেট, বিরতি সহ "যখন (সত্য)" এর চেয়ে ভাল আর কিছু নয়। উভয় ক্ষেত্রেই আপনাকে কোডটি দেখতে হবে। একটি নির্বোধ কারণ পেশ করা (এবং ক্ষুদ্রতর দক্ষতা একটি নির্বুদ্ধি যুক্তি) উপায় দ্বারা, আপনার ক্ষেত্রে সহায়তা করে না।
ডেভিড থর্নলি

5
@ ডেভ: আমি একটি কারণ দিয়েছি: এটি লুপ পাওয়ার একমাত্র উপায় যা মাঝখানে অবস্থাটি পরীক্ষা করে। ক্লাসিক উদাহরণ: while(true) {string line; std::getline(is,line); if(!is) break; lines.push_back(line);}অবশ্যই আমি এটিকে পূর্ব std::getlineশর্তযুক্ত লুপে রূপান্তর করতে পারি ( লুপের শর্ত হিসাবে ব্যবহার করে ) তবে এটির নিজের অসুবিধাগুলি রয়েছে ( lineলুপের স্কোপের বাইরে একটি পরিবর্তনশীল হতে হবে)। এবং যদি আমি তা করি তবে আমাকে জিজ্ঞাসা করতে হবে: কেন আমাদের তিনটি লুপ আছে? আমরা সবসময় সব কিছু পূর্ব শর্তযুক্ত লুপে রূপান্তর করতে পারি। যেটি সবচেয়ে উপযুক্ত তা ব্যবহার করুন। যদি while(true)ফিট হয়, তবে এটি ব্যবহার করুন।
এসবিআই

3
লোকেরা এই উত্তরটি পড়ার সৌজন্য হিসাবে, আমি যে উত্তম প্রশ্নটি উত্থাপিত হয়েছিল তার গুণমান সম্পর্কে মন্তব্য করা এড়াতে এবং প্রশ্নের উত্তরটি নিজেই আটকে রাখতে চাই। প্রশ্নটি নিম্নলিখিতগুলির একটি প্রকরণ, যা আমি বিশ্বাস করি যে অনেকগুলি ভাষার বৈশিষ্ট্য: আপনার কাছে অন্য লুপের অভ্যন্তরে একটি লুপ রয়েছে। আপনি ভিতরের লুপ থেকে বাইরের লুপটি ভেঙে ফেলতে চান want এটি কিভাবে হয়?
অ্যালেক্স লাইবোউইটজ

172

আপনি ব্যবহার করতে পারেন goto

while ( ... ) {
   switch( ... ) {
     case ...:
         goto exit_loop;

   }
}
exit_loop: ;

12
শুধু এই কীওয়ার্ডটি নিয়ে বুনো না।
ফ্রেসওয়ার্থ

45
এটা মজার বিষয় যে আমি মানুষকে পছন্দ করি না বলে হতাশ হয়ে যাই goto। ওপি স্পষ্টভাবে পতাকা ব্যবহার না করে উল্লেখ করেছে । ওপির সীমাবদ্ধতা বিবেচনা করে আপনি কী আরও ভাল উপায়ের পরামর্শ দিতে পারেন? :)
মেহরদাদ আফশারি

18
নির্বোধ গোটো বিদ্বেষীদের ক্ষতিপূরণ দেওয়ার জন্য কেবলমাত্র টি-তে উন্নীত করা হয়েছে। আমার ধারণা মেহরদাদ জানতেন যে তিনি এখানে সংবেদনশীল সমাধানের পরামর্শ দেওয়ার জন্য কয়েকটি পয়েন্ট হারাবেন।
মাইকেল ক্রেলিন - হ্যাকার

6
+1, অপস এর সীমাবদ্ধতা বিবেচনা করার পরেও ইমোহোর আর কোনও ভাল উপায় নেই। পতাকাগুলি কুৎসিত, পুরো লুপ জুড়ে যুক্তি ছড়িয়ে দেয় এবং এইভাবে বুঝতে আরও অসুবিধা হয়।
জোহানেস স্কাউব -

11
দিনের শেষে, গোটো কনস্ট্রাক্ট ব্যতীত সমস্ত ভাষা ব্যর্থ হয়। উচ্চ স্তরের ভাষাগুলি এটিকে অস্পষ্ট করে তোলে তবে আপনি যদি হুডের নীচে যথেষ্ট শক্ত দেখতে পান তবে আপনি প্রতিটি লুপ দেখতে পাবেন, বা শর্তটি শর্তযুক্ত এবং শর্তহীন শাখায় ফোটে। আমরা কীওয়ার্ডগুলি ব্যবহার করার সময়, যখন পর্যন্ত স্যুইচ করি তবে নিজেকে বোকা বানাই তবে শেষ পর্যন্ত তারা সকলেই একটি উপায় বা অন্যভাবে GOTO (বা JMP) ব্যবহার করে। এটি গোপন করার জন্য বিভিন্ন ধরণের চতুর উপায় উদ্ভাবন করে আপনি নিজেকে বিভ্রান্ত করতে পারেন, বা আপনি কেবল ব্যবহারিকভাবে সৎ হতে পারেন এবং গোটো যেখানে উপযুক্ত সেখানে এবং অল্প পরিমাণে ব্যবহার করতে পারেন।
unsynchronized

57

একটি বিকল্প সমাধান হ'ল মূল শব্দটি continueসাথে সংযুক্ত করে ব্যবহার করা break, অর্থাত:

for (;;) {
    switch(msg->state) {
    case MSGTYPE
        // code
        continue; // continue with loop
    case DONE:
        break;
    }
    break;
}

ব্যবহার করুন continueপ্রতিটি ক্ষেত্রে ট্যাগ যেখানে আপনি লুপের চালিয়ে যেতে এবং ব্যবহার করতে চান শেষ করতে বিবৃতি breakক্ষেত্রে লেবেল লুপ বিনষ্ট করা উচিত শেষ করতে বিবৃতি।

অবশ্যই এই সমাধানটি কেবল তখনই কাজ করে যদি স্যুইচ স্টেটমেন্টের পরে কার্যকর করার জন্য কোনও অতিরিক্ত কোড না থাকে।


9
এটি প্রকৃতপক্ষে খুব মার্জিত হলেও, এর অসুবিধাও রয়েছে যে বেশিরভাগ বিকাশকারীদের প্রথমে এক মিনিটের জন্য এটি দেখতে হয় যাতে এটি / কীভাবে কাজ করে তা বুঝতে। :(
এসবিআই

8
শেষ বাক্যটি এটিকে এত দুর্দান্ত করে :(না অন্যথায় খুব পরিষ্কার বাস্তবায়ন।
নওফাল

আপনি যখন এটি সম্পর্কে চিন্তা করেন, কোনও কম্পিউটার কোড ভাল হয় না। আমরা কেবল এটি বুঝতে প্রশিক্ষিত। উদাহরণস্বরূপ xML টি আবর্জনার মতো লাগছিল যতক্ষণ না আমি এটি শিখি। এখন এটি কম আবর্জনা খুঁজছেন। (ইন্টি x = 0; x <10; ++ এক্স, মুভি কার্সার (x, y)) এর জন্য আসলে আমার প্রোগ্রামটিতে একটি লজিক ত্রুটি ঘটেছে। আমি ভুলে গিয়েছিলাম যে আপডেটের শর্তটি শেষে হয়েছিল।

22

এটি করার একটি পরিষ্কার উপায় হ'ল এটি কোনও ফাংশনে রাখা:

int yourfunc() {

    while(true) {

        switch(msg->state) {
        case MSGTYPE: // ... 
            break;
        // ... more stuff ...
        case DONE:
            return; 
        }

    }
}

Ptionচ্ছিকভাবে (তবে 'খারাপ অভ্যাস'): ইতিমধ্যে প্রস্তাবিত আপনি গোটো ব্যবহার করতে পারেন, বা সুইচের অভ্যন্তরে একটি ব্যতিক্রম নিক্ষেপ করতে পারেন।


4
ব্যতিক্রম, ভাল, একটি ব্যতিক্রম নিক্ষেপ করা উচিত, একটি ফাংশন এর ভাল জ্ঞান আচরণ নয়।
ক্লিমেন্ট হেরেম্যান

আমি আফটার লাইফের সাথে একমত: এটি একটি ফাংশনে রাখুন।
ডাল

14
এক্ষেত্রে ব্যতিক্রম ছুঁড়ে ফেলা সত্যিই খারাপ। এর অর্থ "আমি একটি গোটো ব্যবহার করতে চাই, তবে আমি কোথাও পড়েছি যে আমার সেগুলি ব্যবহার করা উচিত নয়, তাই আমি একটি সাবটারফিউজ নিয়ে গিয়ে স্মার্ট দেখতে ভান করব"।
গর্পিক

আমি একমত যে একটি ব্যতিক্রম নিক্ষেপ করা বা গোটো ব্যবহার করা একটি ভয়ানক ধারণা, তবে তারা কার্যকর বিকল্পগুলি এবং আমার উত্তরে যেমন তালিকাভুক্ত হয়েছে।
Alter Life

2
একটি ব্যতিক্রম নিক্ষেপ একটি GOTO জন্য একটি COMEFROM প্রতিস্থাপন করা হয়। এটা করবেন না। গোটো আরও ভাল কাজ করে।
ডেভিড থর্নলি

14

এএআইএআইএকি সি ++ তে কোনও "ডাবল ব্রেক" বা অনুরূপ নির্মাণ নেই। নিকটতমটি হ'ল goto- যা এর নামের সাথে খারাপ ধারণার কারণ রয়েছে, কারণেই এটি ভাষায় উপস্থিত রয়েছে - যতক্ষণ না এটি সাবধানে এবং অল্প পরিমাণে ব্যবহার করা হয়, ততক্ষণ এটি একটি কার্যকর বিকল্প।


8

আপনি নিজের স্যুইচটিকে আলাদা আলাদা ফাংশনে রেখে দিতে পারেন:

bool myswitchfunction()
{
    switch(msg->state) {
    case MSGTYPE: // ... 
        break;
    // ... more stuff ...
    case DONE:
        return false; // **HERE, I want to break out of the loop itself**
    }
    return true;
}

while(myswitchfunction())
    ;

7

আপনি গোটো পছন্দ না করলেও লুপ থেকে বেরিয়ে আসার জন্য কোনও ব্যতিক্রম ব্যবহার করবেন না। নিম্নলিখিত নমুনাটি দেখায় যে এটি কুরুচিপূর্ণ হতে পারে:

try {
  while ( ... ) {
    switch( ... ) {
      case ...:
        throw 777; // I'm afraid of goto
     }
  }
}
catch ( int )
{
}

আমি এই উত্তর gotoহিসাবে ব্যবহার করবে । এই ক্ষেত্রে কোড আরও স্পষ্ট করে তুলবে অন্য যে কোনও বিকল্পের পরে। আমি আশা করি এই প্রশ্নটি সহায়ক হবে।goto

তবে আমি মনে করি যে gotoস্ট্রিংয়ের কারণে এখানে ব্যবহার করা একমাত্র বিকল্প while(true)। আপনার লুপটি রিফ্যাক্টরিংয়ের বিষয়টি বিবেচনা করা উচিত। আমি মনে করি যে নিম্নলিখিত সমাধানগুলি:

bool end_loop = false;
while ( !end_loop ) {
    switch( msg->state ) {
    case MSGTYPE: // ... 
        break;
    // ... more stuff ...
    case DONE:
        end_loop = true; break;
    }
}

বা এমনকি নিম্নলিখিত:

while ( msg->state != DONE ) {
    switch( msg->state ) {
    case MSGTYPE: // ... 
        break;
    // ... more stuff ...
}

1
হ্যাঁ, তবে আমি ব্যতিক্রমগুলি আরও কম পছন্দ করি ;-)
কোমরানা

3
গোটো অনুকরণ করতে ব্যতিক্রম ব্যবহার করা আসলে গোটো ব্যবহারের চেয়ে খারাপ অবশ্যই! এটি সম্ভবত উল্লেখযোগ্যভাবে ধীর হবে।
জন কার্টার

2
@ ডাউনভোটার: আমি বলেছি যে, আপনার ব্যতিক্রম ব্যবহার করা উচিত নয় বা আমি রিফ্যাক্টরিংয়ের পরামর্শ দিই?
কিরিল ভি লিয়াডভিনস্কি

1
নিম্ন ভোটার নয় - তবে ... আপনার উত্তরটি পরিষ্কার নয় যে আপনি লুপ থেকে বেরিয়ে আসার জন্য কোনও ব্যতিক্রম ব্যবহার করার ধারণা প্রস্তাব করছেন বা নিন্দা করছেন কিনা। হতে পারে প্রথম বাক্যটি হওয়া উচিত: "আপনার পছন্দ gotoনা হলেও লুপ থেকে বেরিয়ে যাওয়ার জন্য কোনও ব্যতিক্রম ব্যবহার করবেন না :"?
জোনাথন লেফলার

1
@ জোনাথন লেফলার, ধন্যবাদ, আপনি মূল্যবান মন্তব্যের নমুনা দেখিয়েছেন। আপনার মন্তব্যের কথা মাথায় রেখে উত্তর আপডেট করেছেন।
কিরিল ভি লিয়াডভিনস্কি

5

এক্ষেত্রে লুপটি ভেঙে ফেলার জন্য কোনও সি ++ টির মতো নির্মাণ নেই।

হয় লুপটিকে বাধা দেওয়ার জন্য একটি পতাকা ব্যবহার করুন বা (যদি উপযুক্ত হয়) আপনার কোডটি একটি ফাংশন থেকে বের করে ব্যবহার করুন return


2

আপনি সম্ভবত গোটো ব্যবহার করতে পারেন তবে আমি একটি পতাকা সেট করতে পছন্দ করব যা লুপটি থামিয়ে দেয়। তারপরে সুইচটি ভেঙে দিন।


2

সমস্যাটি অদৃশ্য হয়ে যাওয়ার কারণে কেন কেবল আপনার সময় লুপটিতে শর্তটি স্থির করবেন না?

while(msg->state != DONE)
{
    switch(msg->state) {
    case MSGTYPE: // ... 
        break;
    // ... more stuff ...
    case DONE:
        // We can't get here, but for completeness we list it.
        break; // **HERE, I want to break out of the loop itself**
    }
}

2

না, সি ++ এর জন্য কোনও নির্মাণের প্রয়োজন নেই, প্রদত্ত শব্দটি "ব্রেক" শব্দটি ইতিমধ্যে স্যুইচ ব্লক থেকে বেরিয়ে আসার জন্য সংরক্ষিত রয়েছে। বিকল্পভাবে একটি ডো..এর সময় () একটি প্রস্থান পতাকা সহ যথেষ্ট হতে পারে।

do { 
    switch(option){
        case 1: ..; break;
        ...
        case n: .. ;break;
        default: flag = false; break;
    }
} while(flag);

1

আমি মনে করি;

while(msg->state != mExit) 
{
    switch(msg->state) 
    {
      case MSGTYPE: // ...
         break;
      case DONE:
      //  .. 
      //  ..
      msg->state =mExit;
      break;
    }
}
if (msg->state ==mExit)
     msg->state =DONE;

0

এটি করার সহজতম উপায় হ'ল আপনি সুইচ করার আগে একটি সাধারণ আইফোন স্থাপন করা এবং লুপটি থেকে বেরিয়ে আসার জন্য যদি আপনার শর্তটি পরীক্ষা করা হয় তবে .......... যতটা সহজ হতে পারে


2
উম ... আপনি এই শর্তটি তর্ক করার সময় আরও সহজ করে তুলতে পারেন। আমি বলতে চাইছি এটি এখানে কি! :)
মার্ক এ। ডোনোহো

0

breakসি ++ এর কীওয়ার্ডটি কেবল সর্বাধিক নেস্টেড এনক্লোজিং পুনরাবৃত্তি বা switchবিবৃতি বন্ধ করে দেয়। সুতরাং, আপনি while (true)সরাসরি switchবিবৃতিতে লুপটি বের করতে পারেন না ; তবে আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন, যা আমার মনে হয় যে এই ধরণের সমস্যার জন্য একটি দুর্দান্ত প্যাটার্ন:

for (; msg->state != DONE; msg = next_message()) {
    switch (msg->state) {
    case MSGTYPE:
        //...
        break;

    //...
    }
}

যদি আপনার কিছু msg->stateসমান হওয়ার দরকার হয় DONE(যেমন একটি ক্লিনআপ রুটিন চালান), তবে forলুপের সাথে সাথেই কোডটি রাখুন ; যেমন আপনার যদি বর্তমানে থাকে:

while (true) {
    switch (msg->state) {
    case MSGTYPE:
        //... 
        break;

    //...

    case DONE:
        do_cleanup();
        break;
    }

    if (msg->state == DONE)
        break;

    msg = next_message();
}

তার পরিবর্তে ব্যবহার করুন:

for (; msg->state != DONE; msg = next_message()) {
    switch (msg->state) {
    case MSGTYPE:
        //...
        break;

    //...
    }
}

assert(msg->state == DONE);
do_cleanup();

0

এটি বিস্ময়ের গভীরতা বিবেচনা করে কতটা সহজ তা আমাকে অবাক করে দেয় ... আপনার যা দরকার তা এখানে ...

bool imLoopin = true;

while(imLoopin) {

    switch(msg->state) {

        case MSGTYPE: // ... 
            break;

        // ... more stuff ...

        case DONE:
            imLoopin = false;
            break;

    }

}

হাঃ হাঃ হাঃ!! সত্যিই! আপনার এটাই দরকার! একটি অতিরিক্ত পরিবর্তনশীল!


0
while(MyCondition) {
switch(msg->state) {
case MSGTYPE: // ... 
    break;
// ... more stuff ...
case DONE:
   MyCondition=false; // just add this code and you will be out of loop.
    break; // **HERE, you want to break out of the loop itself**
}
}

0

আমি একই সমস্যা পেয়েছি এবং একটি পতাকা ব্যবহার করে সমাধান করেছি।

bool flag = false;
while(true) {
    switch(msg->state) {
    case MSGTYPE: // ... 
        break;
    // ... more stuff ...
    case DONE:
        flag = true; // **HERE, I want to break out of the loop itself**
    }
    if(flag) break;
}

-2

যদি আমি সি ++ সিনট্যাক্সটি ভালভাবে মনে রাখি তবে আপনি breakঠিক মত স্টেটমেন্টে একটি লেবেল যুক্ত করতে পারেন goto। সুতরাং আপনি যা চান তা সহজেই লেখা হবে:

while(true) {
    switch(msg->state) {
    case MSGTYPE: // ...
        break;
    // ... more stuff ...
    case DONE:
        break outofloop; // **HERE, I want to break out of the loop itself**
    }
}

outofloop:
// rest of your code here

1
দুর্ভাগ্যক্রমে, আপনার স্মৃতি ত্রুটিযুক্ত। এটি বিরল উপলক্ষে এটি কার্যকর হবে যেখানে এটি একটি দুর্দান্ত বৈশিষ্ট্য হবে। (কয়েক স্তরের ভেঙে যাওয়ার জন্য আমি প্রস্তাবগুলি দেখেছি, তবে সেগুলি আমার দিকে ত্রুটিগুলি হওয়ার মতো অপেক্ষা করে))
ডেভিড থর্নলে

তখন অবশ্যই জাভা ছিল। উত্তর করার জন্য ধন্যবাদ. এবং, অবশ্যই, আপনি বাকীটিও ঠিক রেখেছেন।
আন্দ্রেই বাজনা দ্বিতীয়

-3
  while(true)
  {
    switch(x)
    {
     case 1:
     {
      break;
     }
    break;
   case 2:
    //some code here
   break;
  default:
  //some code here
  }
}

1
এই কোড নমুনার সমস্ত ব্রেকগুলি সুইচ স্টেটমেন্টের বাইরে চলে যায়।
ড্যান হাল্মে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.