একটি স্যুইচ বিবৃতিতে অবিরত ব্যবহার করে


91

আমি switchনীচের কোডের লুপ বিবৃতিতে একটি বিবৃতিটির মাঝামাঝি থেকে লাফাতে চাই :

while (something = get_something())
{
    switch (something)
    {
    case A:
    case B:
        break;
    default:
        // get another something and try again
        continue;
    }
    // do something for a handled something
    do_something();
}

এটি কি ব্যবহারের একটি কার্যকর উপায় continue? হয় continueদ্বারা উপেক্ষিত বিবৃতি switchবিবৃতি? সি এবং সি ++ এর আচরণের ক্ষেত্রে কী এখানে পার্থক্য রয়েছে?


আপনার ধারণাটি ঠিক আছে তবে উপরের লুপটি কখনই কার্যকর হবে না do_something()
এন্টিক

4
এমনকি যদি নিয়ন্ত্রণ এ বা কেস কেস কেটে যায়?
আলেকজান্ডার পোলেক্টোভ

18
আমি বলতে যাচ্ছিলাম, অ্যান্টিক সে সম্পর্কে ভুল। A বা B এর ক্ষেত্রে do_something () কার্যকর হবে। ডিফল্ট সাথে এটি জামিন করবে।
অ্যান্টনি উডস

4
@ অ্যাক্রন, এটিই উদ্দেশ্যমূলক আচরণ
ম্যাট

4
আমি মনে করি এটি দেখতে অনেক বেশি সন্দেহজনক এবং বিভ্রান্তিকর এবং তাই এ এর ​​চেয়ে বেশি ক্ষতিকারক goto
ফোয়গন

উত্তর:


57

এটি ঠিক আছে, continueবিবৃতিটি ঘেরযুক্ত লুপের সাথে সম্পর্কিত এবং আপনার কোডটি সমান হতে হবে (এই জাতীয় জাম্পের বিবৃতি এড়ানো):

while (something = get_something()) {
    if (something == A || something == B)
        do_something();
}

তবে আপনি যদি breakলুপটি থেকে বেরিয়ে আসার প্রত্যাশা করেন, যেমন আপনার মন্তব্য অনুসারে (এটি সর্বদা অন্য কিছু দিয়ে আবার চেষ্টা করে, যতক্ষণ না এটি মিথ্যা হিসাবে মূল্যায়ন করে), আপনার আলাদা কাঠামো প্রয়োজন need

উদাহরণ স্বরূপ:

do {
    something = get_something();
} while (!(something == A || something == B));
do_something();

4
কেবল শব্দার্থক অর্থে 'সমতুল্য'। সংকলকটি উত্পন্ন কোডটি খুব আলাদা। একটি সুইচ বিবৃতি দিয়ে, কম্পাইলার একটি লাফ টেবিল একাধিক তুলনা এড়াতে এবং এইভাবে অনেক দ্বারা 1. প্রতিটি উপাদান 1 বিরুদ্ধে তুলনা চেয়ে দ্রুত তৈরি করতে পারেন
chacham15

@ চাচাম ১৫, কেন সংকলক উভয়ের জন্য একই কোড তৈরি করতে পারেনি?
আওকার

@ ওয়াকার স্যুইচ স্টেটমেন্টগুলি জাম্প টেবিল তৈরি করে যেখানে অন্য উপস্থাপনাটি যৌক্তিক মূল্যায়নের একটি সিরিজ। আরও তথ্যের জন্য গুগল জাম্প টেবিল।
chacham15

@ চাচাম ১৫, সংকলকটি যদি দুটিটির জন্য একটি জাম্প টেবিল তৈরি করতে বাধা দেয় বা যদি স্যুইচটির জন্য বিবৃতি বা লজিক্যাল মূল্যায়নের ধারাবাহিক হয়?
অবাকর

4
@ ওয়াকার স্যুইচ স্টেটমেন্টগুলির ক্ষেত্রে কেসগুলি ধ্রুবক মান হওয়া দরকার, কারণ যদি বিবৃতি দেওয়া হয় তবে এটি একই অপটিমাইজেশন করতে পারে না (দ্রষ্টব্য: আমি সাধারণ ক্ষেত্রে বলছি, এটি নির্দিষ্ট প্রয়োজনীয়তা দিয়ে দেওয়া সম্ভব (যেমন কেবল কনস্ট মানগুলি , কেবলমাত্র কিছু লজিকাল অপারেটর ইত্যাদি) অপ্টিমাইজেশন করতে, তবে এটি অত্যন্ত সংকলক নির্ভর এবং ওয়াইএমএমভি)।
chacham15

21

হ্যাঁ, এটি ঠিক আছে - এটি ifবিবৃতিতে ব্যবহার করার মতো । অবশ্যই, আপনি breakএকটি সুইচের অভ্যন্তর থেকে লুপটি ভাঙ্গতে একটি ব্যবহার করতে পারবেন না ।


কিন্তু ifএর আচরণের উপর কোনো প্রভাব নেই continueবা break। আপনি এটি কীভাবে বোঝাতে চাইছেন?
ম্যাট জয়েনার

@ ম্যাট মানে আমি উভয় ক্ষেত্রে লুপটি চালিয়ে যাব।

4
@ নীল, ঠিক আছে, বিভ্রান্তি এড়ানো গেছে।
ম্যাট জয়েনার

4
@ কিজে আমি এর জন্য কোনও রেফারেন্স খুঁজে পাই না, এবং সি প্রোগ্রামিংয়ের বহু বছরে আমি কখনই এমন সংকলক দেখিনি যা এটিকে সমর্থন করে ... পৃথিবীতে আপনি কোথায় এটি পেলেন?
আর্জুনইগ

4
বাহ, দুঃখিত, আমি এটি পিএইচপি-তে দেখেছি, এটি একটি পুরানো অনুশীলন বলে মনে হয়েছিল, এটি কেবল পিএইচপি ...
কি জাই

15

হ্যাঁ, চালিয়ে যাওয়া সুইচ বিবৃতি দ্বারা উপেক্ষা করা হবে এবং পরীক্ষার জন্য লুপের শর্তে যাবে। আমি রিচি দ্বারা সি প্রোগ্রামিং ল্যাঙ্গুয়েজ রেফারেন্স থেকে এই নির্যাসটি ভাগ করতে চাই:

continueবিবৃতি সঙ্গে সম্পর্কযুক্ত break, কিন্তু কম প্রায়ই ব্যবহার করা; এটা পরিক্ষেপ পরবর্তী পুনরাবৃত্তিতে ঘটায় for, whileঅথবা doলুপ শুরু করার। ইন whileএবং do, এর মানে পরীক্ষা অংশ অবিলম্বে মৃত্যুদন্ড কার্যকর করা হয় যে; মধ্যে for, নিয়ন্ত্রণ বর্ধিত পদক্ষেপে পাস করে।

চালিয়ে যাওয়া বিবৃতিটি কেবলমাত্র লুপগুলিতে প্রয়োগ হয়, কোনও switchবিবৃতিতে নয়। একজন continueভিতরে switchএকটি লুপ ভিতরে পরবর্তী লুপ পুনরাবৃত্তির কারণ।

আমি সি ++ এর জন্য সে সম্পর্কে নিশ্চিত নই।


8

এটি সিনথেটিকভাবে সঠিক এবং স্টাইলিস্টিকালি ঠিক আছে।

ভাল স্টাইলের প্রতিটি case:বিবৃতি নিম্নলিখিতগুলির একটির সাথে শেষ হওয়া উচিত:

 break;
 continue;
 return (x);
 exit (x);
 throw (x);
 //fallthrough

অতিরিক্তভাবে, case (x):সাথে সাথে অনুসরণ করা

 case (y):
 default:

অনুমোদিত - বেশ কয়েকটি কেস বান্ডিলিংয়ের ক্ষেত্রে ঠিক একই প্রভাব রয়েছে।

আর কিছু, ভুল হতে সন্দেহ করা হয় ঠিক if(a=4){...} অবশ্যই আপনি পরিক্ষেপ প্রয়োজন লুপ ( while, for, do...whileজন্য) continueকাজ। এটি case()একা ফিরে যাবে না । তবে একটি নির্মাণ যেমন:

while(record = getNewRecord())
{
    switch(record.type)
    {
        case RECORD_TYPE_...;
            ...
        break;
        default: //unknown type
            continue; //skip processing this record altogether.
    }
    //...more processing...
}

...ঠিক আছে.


4
নেক্রোপোস্টিংয়ের জন্য দুঃখিত, তবে আমি যুক্ত করব যে একটি কলটি exitসাধারণত একটি স্যুইচ কেসটি শেষ করার জন্য একটি ভাল জিনিস হয়ে যায়।
মান

4
ঠিক আছে, আমি এখানে সমস্ত ডাঃ ফ্রাঙ্কেনস্টাইনকে পেয়ে যাচ্ছি এবং এটিও দেখিয়েছি যে default:শেষ / নীচে প্রবেশের দরকার নেই - যেমন এই প্রশ্নটি উল্লেখ করেছে ...
স্লিএসভেন

4
@ স্লাইসভেন: অদ্ভুতভাবে, এটি হয় না, তবে যদি এটি শেষ না করার কোনও উপযুক্ত কারণ না থাকে তবে এটিকে শেষ করে দিন। এটি অন্য জায়গায় ব্যবহার করা হলে প্রায়ই বিভ্রান্ত হয়।
এসএফ

4
@ এসএফ। ভাল, আমি সহজেই কেসগুলি কল্পনা করতে পারি যখন default:শেষের পরিবর্তে কেসটিকে প্রথমে তৈরি করা আরও বুদ্ধিমান হয় । "এটি করুন, যদি না আপনি নিম্নলিখিত অস্বাভাবিক মানগুলি পান, যা নীচে হিসাবে পরিচালনা করা উচিত"।
রুসলান

5

প্রযুক্তিগতভাবে বৈধ থাকাকালীন, এই সমস্ত লাফিয়ে দেয় অস্পষ্ট নিয়ন্ত্রণ প্রবাহ - বিশেষত continueবিবৃতি।

আমি প্রথমটি নয়, সর্বশেষ অবলম্বন হিসাবে এই কৌশলটি ব্যবহার করব।

কেমন

while (something = get_something())
{
    switch (something)
    {
    case A:
    case B:
        do_something();
    }        
}

এটি সংক্ষিপ্ত এবং আরও পরিষ্কার উপায়ে এর স্টাফ সঞ্চালন।


4
বিভ্রান্তির জন্য দুঃখিত আলেকজান্ডার, কোডটি কেবলমাত্র প্রদর্শনের জন্য, আমার কোডে আসল কাঠামোর জন্য আমার কাছে ভাল কারণ আছে (আমি বিশ্বাস করি)।
ম্যাট জয়েনার

4
@ ম্যাট: এর অর্থ সম্ভবত আরও অবলম্বিত কাঠামো ... :)
দর্শনার্থী

-2

এটি দেরিতে মেগাবাইট হতে পারে তবে আপনি ব্যবহার করতে পারেন continue 2

কিছু পিএইচপি বিল্ড / কনফিগারেশন এই সতর্কতাটি আউটপুট দেবে:

পিএইচপি সতর্কতা: "চালিয়ে" লক্ষ্যবস্তু সুইচ "বিরতি" সমান। আপনার কি "চালিয়ে যাওয়া 2" ব্যবহারের অর্থ ছিল?

উদাহরণ স্বরূপ:

$i = 1;

while ($i <= 10) {
    $mod = $i % 4;
    echo "\r\n out $i";
    $i++;
    switch($mod)
    {
        case 0:
            break;
        case 2:
            continue;
            break;
        default:
            continue 2;
            break;
    }
    echo " is even";
}

এটি আউটপুট দেবে:

out 1
out 2 is even
out 3
out 4 is even
out 5
out 6 is even
out 7
out 8 is even
out 9
out 10 is even

পিএইচপি 5.5 এবং তারও বেশি দিয়ে পরীক্ষিত।


4
এটি কোনও পিএইচপি প্রশ্ন নয়।
জেফ্রি

-4

স্যুইচটিকে লুপ হিসাবে বিবেচনা করা হয় না তাই আপনি সুইচ-এ কোনও কেস স্টেটমেন্টের ভিতরে চালিয়ে ব্যবহার করতে পারবেন না ...


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