আমাদের সুইচ ব্রেক ব্যবহার করতে হবে কেন?


74

কে সিদ্ধান্ত নিয়েছে (এবং কোন ধারণার ভিত্তিতে) যে switchনির্মাণটি (বহু ভাষায়) breakপ্রতিটি বিবৃতিতে ব্যবহার করতে হয়?

আমাদের কেন এমন কিছু লিখতে হবে:

switch(a)
{
    case 1:
        result = 'one';
        break;
    case 2:
        result = 'two';
        break;
    default:
        result = 'not determined';
        break;
}

(পিএইচপি এবং জেএসে এটি লক্ষ্য করা গেছে; এটি ব্যবহার করে সম্ভবত আরও অনেকগুলি ভাষা রয়েছে)

যদি এর switchবিকল্প হয় তবে ifআমরা কেন একই নির্মাণকে ব্যবহার করতে পারি না if? অর্থাৎ,

switch(a)
{
    case 1:
    {
        result = 'one';
    }
    case 2:
    {
        result = 'two';
    }
    default:
    {
        result = 'not determined';
    }
}

বলা হয়ে থাকে যে breakবর্তমানটিকে অনুসরণ করে ব্লকটি কার্যকর করা বাধা দেয়। কিন্তু, কেউ কি সত্যিই এমন পরিস্থিতির মধ্যে চলে যায়, যেখানে বর্তমান ব্লকটি এবং তার অনুসরণকারীদের কার্যকর করার কোনও প্রয়োজন ছিল? আমি না। আমার জন্য, breakসবসময় আছে। প্রতিটি ব্লকে প্রতিটি কোডে।


1
বেশিরভাগ উত্তরে যেমন উল্লেখ করা হয়েছে, এটি 'ফল-থ্রু' এর সাথে সম্পর্কিত, যেখানে একাধিক শর্ত একই 'তারপরে' ব্লকগুলির মধ্যে দিয়ে যায়। যাইহোক, এটি ভাষা নির্ভর - আরপিজি, উদাহরণস্বরূপ, কোনও CASEবিবৃতি দৈত্যের সমতুল্য বিবেচনা করে যদি / অন্যটি ব্লক করে।
ক্লকওয়ার্ক-মিউজিক

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

4
আমি বেশ কয়েকটি অনুষ্ঠানে ফল-থ্রু ব্যবহার করেছি, যদিও তত্ক্ষণাত আমার সিলেক্ট ভাষায় স্যুইচ স্টেটমেন্টটি (সি) এড়াতে ডিজাইন করা যেতে পারে; যেমন আমি করেছি case 'a': case 'A': case 'b': case 'B'তবে বেশিরভাগ কারণেই আমি করতে পারি না case in [ 'a', 'A', 'b', 'B' ]। কিছুটা ভাল প্রশ্ন হ'ল, আমার বর্তমান পছন্দসই ভাষাতে (সি #), বিরতি বাধ্যতামূলক , এবং কোনও অন্তর্নিহিত পতন নেই ; ভুলে যাওয়া breakএকটি সিনট্যাক্স ত্রুটি ...: \
কুতুলু মাইক

1
প্রকৃত কোড সহ ফলস-এর মাধ্যমে প্রায়শই পার্সার বাস্তবায়নের সন্ধান পাওয়া যায়। case TOKEN_A: /*set flag*/; case TOKEN_B: /*consume token*/; break; case TOKEN_C: /*...*/
অরেঞ্জডগ

1
@ ব্লুরাজা-ড্যানিপ্লুঘুফুট: সিও সংকলন সহজ করার জন্য ডিজাইন করা হয়েছিল। "একটি লাফ ক্রেতা যদি breakকোন জায়গায় উপস্থিত হল" চেয়ে বাস্তবায়ন করার জন্য একটি উল্লেখযোগ্যভাবে সহজ নিয়ম "একটি লাফ নির্গত যদি না fallthroughএকটি উপস্থিত switch"।
জন পুরি

উত্তর:


95

সি এই ভাষায় switchবিবৃতি পাওয়া প্রথম ভাষাগুলির মধ্যে একটি ছিল এবং অন্য সমস্ত প্রধান ভাষা সেখান থেকে উত্তরাধিকার সূত্রে পেয়েছিল, বেশিরভাগ ক্ষেত্রে সি শব্দার্থকে ডিফল্টরূপে বজায় রাখার জন্য বেছে নিয়েছিল - তারা হয় এটির পরিবর্তনের সুবিধার কথা ভাবেনি, বা বিচার করেছেন এগুলি প্রত্যেকের ব্যবহার করা আচরণের চেয়ে কম গুরুত্বপূর্ণ।

কেন সিটিকে সেভাবে ডিজাইন করা হয়েছিল, এটি সম্ভবত "বহনযোগ্য সমাবেশ" হিসাবে সি এর ধারণা থেকে উদ্ভূত হয়েছিল। switchবিবৃতি মূলত একটি একজন বিমূর্ততা হয় শাখা টেবিল , এবং একটি শাখা টেবিল এছাড়াও একটি অন্তর্নিহিত পতনের মাধ্যমে এবং একটি অতিরিক্ত লাফ নির্দেশ এটা এড়ানোর প্রয়োজন।

তাই মূলত, C- এর ডিজাইনার এছাড়াও ডিফল্ট অনুসারে প্রতীকী ভাষান্তর শব্দার্থবিদ্যা রাখাই পছন্দ করলো।


3
VB.NET একটি ভাষার উদাহরণ যা এটি বদলেছিল। কেস ক্লজের মধ্যে এটি প্রবাহিত হওয়ার কোনও বিপদ নেই।
অকর্মা

1
টিসিএল হ'ল অন্য ভাষা যা পরবর্তী দফায় কখনও পড়ে না। কার্যত কখনই এটি করতে চান নি (নির্দিষ্ট ধরণের প্রোগ্রাম লেখার সময় এটি সি এর থেকে কার্যকর নয়)।
ডোনাল ফেলো

4
সি এর পূর্বপুরুষের ভাষা, বি এবং পুরানো বিসিপিএল উভয়েরই (ছিল?) বিবৃতি পরিবর্তন করেছে; বিসিপিএল তা বানান করেছে switchon
কিথ থমসন

রুবির মামলার বিবৃতি পড়ে না; আপনি একক দুটি পরীক্ষার মান রেখে একইরকম আচরণ পেতে পারেন when
নাথান লং

86

কারণ সেই ভাষাগুলিতে বিবৃতি দেওয়ার switchবিকল্প নয় if ... else

ব্যবহার করে switch, আমরা একসাথে একাধিক শর্ত মেলাতে পারি, যা কিছু ক্ষেত্রে অত্যন্ত প্রশংসিত।

উদাহরণ:

public Season SeasonFromMonth(Month month)
{
    Season season;
    switch (month)
    {
        case Month.December:
        case Month.January:
        case Month.February:
            season = Season.Winter;
            break;

        case Month.March:
        case Month.April:
        case Month.May:
            season = Season.Spring;
            break;

        case Month.June:
        case Month.July:
        case Month.August:
            season = Season.Summer;
            break;

        default:
            season = Season.Autumn;
            break;
    }

    return season;
}

15
more than one block ... unwanted in most casesআমি তোমার সাথে একমত নই
সতীশ পান্ডে

2
@ ড্যানিয়েলবি যদিও এটি ভাষার উপর নির্ভর করে; সি # স্যুইচ স্টেটমেন্টগুলি সেই সম্ভাবনার পক্ষে অনুমতি দেয় না।
অ্যান্ডি

5
@ অ্যান্ডি আমরা কি এখনও পড়ার কথা বলছি? সি # স্যুইচ স্টেটমেন্টগুলি অবশ্যই এটির জন্য মঞ্জুরি দেয় (তৃতীয় উদাহরণটি দেখুন), সুতরাং এর জন্য প্রয়োজন break। তবে হ্যাঁ, আমি যতদূর জানি, ডফের ডিভাইস সি # তে কাজ করে না।
ড্যানিয়েল বি

8
@ ড্যানিয়েলবি হ্যাঁ আমরা, তবে সংকলক শর্ত, কোড এবং তারপরে বিরতি ছাড়াই অন্য শর্তটিকে অনুমতি দেবে না। আপনার মধ্যে কোনও শুল্কবিহীন শর্ত থাকতে পারে যার মধ্যে কোনও কোড নেই, বা আপনার একটি বিরতি দরকার। আপনার লিঙ্ক থেকে C# does not support an implicit fall through from one case label to another। আপনি এর মধ্যে পড়ে যেতে পারেন তবে দুর্ঘটনাক্রমে বিরতি ভুলে যাওয়ার কোনও সম্ভাবনা নেই।
অ্যান্ডি

3
@ ম্যাটসেম্যান .. আমি এখন আমরা সমস্ত জিনিস ব্যবহার করে করতে পারি if..elseতবে কিছু পরিস্থিতিতে switch..caseতার চেয়ে ভাল। উপরের উদাহরণটি কিছুটা জটিল হবে যদি আমরা অন্যথায় ব্যবহার করি।
সতীশ পান্ডে

15

সি এর প্রসঙ্গে স্ট্যাক ওভারফ্লোতে এটি জিজ্ঞাসা করা হয়েছে: সুইচ স্টেটমেন্টটি বিরতির প্রয়োজনে কেন ডিজাইন করা হয়েছিল?

গৃহীত উত্তরটির সংক্ষিপ্তসার হিসাবে, এটি সম্ভবত একটি ভুল ছিল। বেশিরভাগ অন্যান্য ভাষাগুলি সম্ভবত সবেমাত্র সি অনুসরণ করেছে তবে, সি # এর মতো কিছু ভাষাগুলি ফলস-মাধ্যমে অনুমতি দিয়ে এটি স্থির করেছে বলে মনে হয় - তবে কেবল তখনই যখন প্রোগ্রামার স্পষ্টভাবে তা বলে দেয় (উত্স: উপরের লিঙ্কটি, আমি নিজে সি # বলি না) ।


গুগল গো একই জিনিস আইআইআরসি করে (স্পষ্টভাবে সুনির্দিষ্টভাবে উল্লেখ করা হলে পতনের জন্য অনুমতি দেয়)।
লিও

পিএইচপি এছাড়াও, না। এবং ফলাফলের কোডটির দিকে আপনি যত বেশি নজর রাখবেন ততই বিরক্তিকর এটি আপনাকে অনুভব করে। আপনার /* FALLTHRU */উপরের @ টেপিওর লিঙ্কিত উত্তরের মন্তব্যটি আমার পছন্দ হয়েছে , এটি প্রমাণ করার জন্য ।
ডেভিপ

1
goto caseলিঙ্কটি যেমনটি সি বলেছে তেমনটি কেন ভাল কাজ করে তা চিত্রিত করে না। আপনি এখনও উপরের মতো একাধিক কেস স্ট্যাক করতে পারেন, তবে আপনি কোডটি goto case whateversertোকানোর সাথে সাথে আপনাকে পরবর্তী কেসটিতে পড়তে হবে বা আপনার একটি সংকলক এরর পেতে হবে। দু'জনের মধ্যে যদি আপনি আমাকে জিজ্ঞাসা করেন, অবহেলার মাধ্যমে অজান্তেই পড়ে যাওয়ার বিষয়ে চিন্তা না করে মামলাগুলি সজ্জিত করার ক্ষমতা সুস্পষ্ট পতনের মাধ্যমে সক্রিয় করার চেয়ে আরও ভাল বৈশিষ্ট্য goto case
জেস্পার

9

আমি একটি উদাহরণ দিয়ে উত্তর দেব। আপনি যদি বছরের এক মাসের জন্য দিনের সংখ্যা তালিকাভুক্ত করতে চান তবে এটি স্পষ্ট যে কিছু মাসের 31, কিছু 30 এবং 1 28/29 রয়েছে। এটি দেখতে এই রকম হবে,

switch(month) {
    case 4:
    case 6:
    case 9:
    case 11;
        days = 30;
        break;
    case 2:
        //Find out if is leap year( divisible by 4 and all that other stuff)
        days = 28 or 29;
        break;
    default:
        days = 31;
}

এটি এমন একটি উদাহরণ যেখানে একাধিক মামলার একই প্রভাব থাকে এবং সবগুলি একত্রে গ্রুপ করা হয়। ব্রেক কিওয়ার্ড বাছাইয়ের স্পষ্টত কারণ ছিল এবং যদি না ... যদি অন্যটি নির্মাণ করা হয়।

এখানে লক্ষ্য করার প্রধান বিষয়টি হ'ল অনেক অনুরূপ মামলার সাথে স্যুইচ স্টেটমেন্টটি যদি হয় না ... অন্যথায় যদি ... অন্যথায় যদি হয় ... তবে প্রতিটি ক্ষেত্রেই হয় (1, 2, 3) ... অন্যথায় যদি (4,5,6) অন্য ...


2
আপনার উদাহরণটি ifকোনও লাভ ছাড়াই আরও ভার্বোজ দেখাচ্ছে । সম্ভবত যদি আপনার উদাহরণ কোনও নাম নির্দিষ্ট করে দেয় বা পতিত-পতনের পাশাপাশি মাস-নির্দিষ্ট কাজ করে, তবে ফলস-থ্রো-এর ইউটিলিটি আরও স্পষ্ট হবে? (প্রথমে একজনের উচিত কিনা সে সম্পর্কে মন্তব্য না করে)
হোরাটিও

1
ঐটা সত্য. আমি তবে কেবল এমন কেসগুলি দেখানোর চেষ্টা করছিলাম যেখানে পড়ে যাওয়া ব্যবহার করা যেতে পারে। এটি অবশ্যই স্পষ্টতই আরও ভাল হবে যদি প্রতিটি মাসে প্রতিটি স্বতন্ত্রভাবে কিছু করার প্রয়োজন হয়।
অ্যাভেমো

8

দুটি পরিস্থিতি যেখানে একটি ক্ষেত্রে থেকে "কেটে যাওয়ার" ক্ষেত্রে ঘটতে পারে - খালি ক্ষেত্রে:

switch ( ... )
{
  case 1:
  case 2:
    do_something_for_1_and_2();
    break;
  ...
}

এবং খালি খালি ক্ষেত্রে

switch ( ... )
{
  case 1:
    do_something_for_1();
    /* Deliberately fall through */
  case 2:
    do_something_for_1_and_2();
    break;
...
}

ডাফের ডিভাইসটির উল্লেখ থাকা সত্ত্বেও , দ্বিতীয় মামলার বৈধ উদাহরণগুলি খুব কম এবং এর মধ্যে রয়েছে এবং সাধারণত কোডিং মান দ্বারা নিষিদ্ধ হয় এবং স্থির বিশ্লেষণের সময় পতাকাঙ্কিত হয়। এবং যেখানে এটি পাওয়া যায়, এটি প্রায়শই বাদ পড়ে না break

পূর্বেরটি পুরোপুরি বুদ্ধিমান এবং সাধারণ।

সত্যি কথা বলতে, আমি breakএবং ভাষা বিশ্লেষককে খালি কেস-বডি পড়ে যাওয়ার বিষয়টি জেনেও প্রয়োজনের কোনও কারণ দেখতে পাচ্ছি না , যখন একটি খালি খালি মামলাটি স্বতন্ত্র।

এটি অত্যন্ত দুঃখের বিষয় যে আইএসও সি প্যানেল অযৌক্তিকর উল্লেখ না করে অপরিজ্ঞাত, অনির্ধারিত বা বাস্তবায়ন-সংজ্ঞায়িত বৈশিষ্ট্যগুলি স্থির করার পরিবর্তে ভাষাতে নতুন (অযাচিত) এবং খারাপভাবে সংজ্ঞায়িত বৈশিষ্ট্যগুলি যুক্ত করার বিষয়ে আরও ডুবে আছে।


2
ধার্মিকতার জন্য ধন্যবাদ আইএসও সি ভাষায় বিরতি পরিবর্তন প্রবর্তনের মধ্যে নেই!
জ্যাক এইডলি

4

breakঅনুমতি জোর করা না এমন কিছু বিষয়কে অনুমতি দেয় যা অন্যথায় করা কঠিন হতে পারে। অন্যরা দলবদ্ধকরণের মামলাগুলি উল্লেখ করেছেন, যার জন্য বেশ কয়েকটি নন-তুচ্ছ ঘটনা রয়েছে।

একটি ক্ষেত্রে যেখানে এটি আবশ্যক যে এটি breakব্যবহার করা হয়নি তা হ'ল ডাফের ডিভাইস । এটি " আনرولোল " লুপগুলিতে ব্যবহৃত হয় যেখানে এটি প্রয়োজনীয় তুলনার সংখ্যা সীমাবদ্ধ করে ক্রিয়াকলাপকে গতিময় করতে পারে। আমি বিশ্বাস করি যে প্রাথমিক ব্যবহারের অনুমতি দেওয়া কার্যকারিতা যা পূর্বে সম্পূর্ণরূপে ঘূর্ণিত লুপের সাথে খুব ধীর ছিল। এটি কিছু ক্ষেত্রে গতির জন্য কোড আকারের ব্যবসা করে।

breakমামলার যদি কোনও কোড থাকে তবে উপযুক্ত মন্তব্য দিয়ে প্রতিস্থাপন করা ভাল অনুশীলন । অন্যথায়, কেউ অনুপস্থিত স্থির করতে হবে breakএবং একটি বাগ প্রবর্তন করবে ।


ডাফের ডিভাইস উদাহরণ (+1) এর জন্য ধন্যবাদ । আমি সেটা সম্পর্কে সচেতন ছিলাম না।
ট্র্যাজার

3

সিতে, যেখানে উত্সটি মনে হয়, switchবিবৃতিটির কোড ব্লকটি কোনও বিশেষ নির্মাণ নয়। এটি কোডের একটি সাধারণ ব্লক, ঠিক যেমন একটি ifবিবৃতিতে একটি ব্লক ।

switch ()
{
}

if ()
{
}

caseএবং defaultএই ব্লকের ভিতরে জাম্প লেবেলগুলি বিশেষভাবে সম্পর্কিত switch। এগুলি যেমন সাধারণ লাফ লেবেল হিসাবে পরিচালনা করা হয় goto। এখানে একটি নির্দিষ্ট নিয়ম রয়েছে যা এখানে গুরুত্বপূর্ণ: কোড প্রবাহকে বাধাগ্রস্ত না করে জাম্প লেবেল কোডের প্রায় সর্বত্রই হতে পারে।

একটি সাধারণ কোড ব্লক হিসাবে এটি কোনও যৌগিক বিবৃতি হওয়া দরকার না। লেবেলগুলিও optionচ্ছিক। এগুলি সিটিতে বৈধ switchবিবৃতি:

switch (a)
    case 1: Foo();

switch (a)
    Foo();

switch (a)
{
    Foo();
}

সি স্ট্যান্ডার্ড নিজেই এটি একটি উদাহরণ হিসাবে দেয় (6.8.4.2):

switch (expr) 
{ 
    int i = 4; 
    f(i); 
  case 0: 
    i=17; 
    /*falls through into default code */ 
  default: 
    printf("%d\n", i); 
} 

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

তদুপরি, defaultএটিও একটি জাম্প লেবেল, এবং এইভাবে শেষ কেস হওয়ার দরকার ছাড়াই যে কোনও জায়গায় যে কোনও জায়গায় থাকতে পারে।

এটি ডফের ডিভাইসটিও ব্যাখ্যা করে:

switch (count % 8) {
    case 0: do {  *to = *from++;
    case 7:       *to = *from++;
    case 6:       *to = *from++;
    case 5:       *to = *from++;
    case 4:       *to = *from++;
    case 3:       *to = *from++;
    case 2:       *to = *from++;
    case 1:       *to = *from++;
            } while(--n > 0);
}

কেন পড়ে? কারণ কোডের একটি সাধারণ ব্লকে স্বাভাবিক কোড প্রবাহে, পরবর্তী বিবৃতিতে পতনের মধ্য দিয়ে প্রত্যাশা করা হয় , যেমনটি আপনি কোনও ifকোড ব্লকে এটি আশা করবেন ।

if (a == b)
{
    Foo();
    /* "Fall-through" to Bar expected here. */
    Bar();
}

switch (a)
{
    case 1: 
        Foo();
        /* Automatic break would violate expected code execution semantics. */
    case 2:
        Bar();
}

আমার অনুমান যে এর কারণ বাস্তবায়নে স্বাচ্ছন্দ্য ছিল। কোনও switchব্লক বিশ্লেষণ এবং সংকলন , বিশেষ বিধিগুলির যত্ন নেওয়ার জন্য আপনার বিশেষ কোডের দরকার নেই । আপনি কেবল এটি অন্য কোনও কোডের মতো পার্স করেন এবং কেবলমাত্র লেবেল এবং জাম্প নির্বাচনের যত্ন নিতে হবে।

এই সমস্ত থেকে একটি আকর্ষণীয় ফলো-আপ প্রশ্নটি হ'ল নীচের নেস্টেড বিবৃতিগুলি "সম্পন্ন হয়েছে" মুদ্রণ করে। অথবা না.

int a = 10;

switch (a)
{
    switch (a)
    {
        case 10: printf("Done.\n");
    }
}

সি স্ট্যান্ডার্ড এটির জন্য যত্নশীল (6.8.4.2.4):

একটি কেস বা ডিফল্ট লেবেল কেবল নিকটস্থ এনক্লোজিং সুইচ বিবৃতিতে অ্যাক্সেসযোগ্য।


1

বেশ কয়েকটি ব্যক্তি ইতিমধ্যে একাধিক শর্তের সাথে মিলের ধারণার কথা উল্লেখ করেছে, যা সময়ে সময়ে অত্যন্ত মূল্যবান। তবে একাধিক শর্তের সাথে মেলে যাবার দক্ষতার জন্য প্রয়োজন হয় না যে আপনি প্রতিটি শর্তের সাথে মেলে এমন একই কাজটি করুন। নিম্নোক্ত বিবেচনা কর:

switch (someCase)
{
    case 1:
    case 2:
        doSomething1And2();
        break;

    case 3:
        doSomething3();

    case 4:
        doSomething3And4();
        break;

    default:
        throw new Error("Invalid Case");
}

এখানে দুটি পৃথক উপায়ে একাধিক শর্তের সেট মেলানো হচ্ছে। 1 এবং 2 শর্তের সাথে এগুলি কেবল কোডের ঠিক একই প্লটের মধ্যে পড়ে এবং ঠিক একই জিনিস করে। 3 এবং 4 শর্তের সাথে, যদিও উভয় কল করেই শেষ হয় doSomething3And4(), কেবল 3 টি কল doSomething3()


পার্টিতে দেরীতে, তবে এটি পুরোপুরি "1 এবং 2" নয় যেমন ফাংশনটির নাম থেকেই বোঝা যায়: তিনটি আলাদা রাষ্ট্র রয়েছে যা সমস্ত case 2কোডকে ট্রিগার করার দিকে পরিচালিত করতে পারে , তাই আমরা যদি সঠিক হতে চাই (এবং আমরা করি) ফাংশনটির নাম হতে হবে doSomethingBecause_1_OR_2_OR_1AND2()বা এমন কিছু হতে হবে (যদিও বৈধ কোড যা একটি অপরিবর্তনীয় দুটি পৃথক ক্ষেত্রে মেলে যদিও এখনও ভালভাবে লিখিত কোডটি কার্যত অস্তিত্বহীন, তাই খুব কমপক্ষে এটি হওয়া উচিত doSomethingBecause1or2())
মাইক 'পোম্যাক্স' কামারম্যানস

অন্য কথায় doSomething[ThatShouldBeDoneInTheCaseOf]1And[InTheCaseOf]2(),। এটি যৌক্তিক এবং / অথবা এর উল্লেখ করে না।
Panzercrisis

আমি জানি যে এটি নয়, তবে কেন এই ধরণের কোড নিয়ে লোকেরা বিভ্রান্ত হয়, তা "এবং" কী তা সম্পূর্ণরূপে ব্যাখ্যা করা উচিত, কারণ "প্রাকৃতিক এবং" বনাম "যৌক্তিক পরিণতি" অনুমান করার জন্য কারও উপর নির্ভর করা যা কেবলমাত্র কার্যকর যখন সঠিকভাবে ব্যাখ্যা করা হয়েছে, উত্তরে নিজেই আরও ব্যাখ্যা প্রয়োজন, বা সেই অস্পষ্টতা অপসারণের জন্য ফাংশন নামের একটি পুনর্লিখনের প্রয়োজন =)
মাইক 'পোম্যাক্স' কামারম্যানস

1

আপনার দুটি প্রশ্নের উত্তর দিতে।

কেন সি বিরতি প্রয়োজন?

এটি "পোর্টেবল অ্যাসেমব্লার" হিসাবে সিএস শিকড়ে নেমে আসে। যেখানে স্যুডো কোডটি সাধারণ ছিল: -

    targets=(addr1,addr2,addr3);
    opt = 1  ## or 0 or 2
switch:
    br targets[opt]  ## go to addr2 
addr1:
    do 1stuff
    br switchend
addr2:
    do 2stuff
    br switchend
addr3
    do 3stuff
switchend:
    ......

স্যুইচ বিবৃতিটি উচ্চ স্তরে অনুরূপ কার্যকারিতা সরবরাহ করার জন্য ডিজাইন করা হয়েছিল।

আমাদের কি কখনও বিরতি ছাড়াই সুইচ আছে?

হ্যাঁ এটি বেশ সাধারণ এবং ব্যবহারের কয়েকটি কেস রয়েছে;

প্রথমত আপনি বেশ কয়েকটি ক্ষেত্রে একই পদক্ষেপ নিতে চাইতে পারেন। আমরা একে অপরের উপরে মামলাগুলি স্ট্যাক করে এটি করি:

case 6:
case 9:
    // six or nine code

রাষ্ট্রের মেশিনগুলিতে প্রচলিত আরেকটি ব্যবহারের ক্ষেত্রে হ'ল এক রাজ্যের প্রক্রিয়া করার পরে আমরা তাত্ক্ষণিকভাবে অন্য একটি রাজ্যে প্রবেশ করতে এবং প্রক্রিয়া করতে চাই:

case 9:
    crashed()
    newstate=10;
case 10:
    claim_damage();
    break;

-2

ব্রেক স্টেটমেন্টটি একটি জাম্পিং স্টেটমেন্ট যা ব্যবহারকারীকে নিকটতম এনক্লোজিং সুইচটি (আপনার ক্ষেত্রে) ছাড়ার সময়, করার জন্য, পূর্বাভাস দেয় allows এটা ঠিক যে হিসাবে সহজ।


-3

আমি মনে করি যে উপরের সমস্ত লিখিত - এই থ্রেডের মূল ফলাফলটি হ'ল যদি আপনি একটি নতুন ভাষা ডিজাইন করতে চান - ডিফল্টটি হ'ল আপনার কোনও breakবিবৃতি যুক্ত করার দরকার নেই এবং সংকলক এটির মতো আচরণ করবে যেমনটি আপনি করেছেন।

আপনি যদি সেই বিরল কেসটি চান যেখানে আপনি পরের কেসটি চালিয়ে যেতে চান - কেবলমাত্র একটি দিয়ে এটি লিখে দিন continue বিবৃতি বিবরণ করুন।

এটি উন্নত করা যেতে পারে যাতে কেবল যদি আপনি মামলার ভিতরে কোঁকড়ানো বন্ধনী ব্যবহার করেন তবে এটি আর চলতে পারে না যাতে উপরের কয়েক মাসের উপরের উদাহরণগুলি একই সঠিক কোড সম্পাদন করে - সর্বদা প্রয়োজন ছাড়াই প্রত্যাশার মতো কাজ করে continue


2
আমি নিশ্চিত নই যে আমি আপনার পরামর্শটি অব্যাহত বিবৃতি সম্পর্কিত তুলনায় বুঝতে পেরেছি। সি এবং সি ++ এর মধ্যে প্রিটিউবের একটি আলাদা অর্থ রয়েছে এবং যদি কোনও নতুন ভাষা সি এর মতো হয় তবে কখনও কখনও সি হিসাবে এবং কখনও কখনও এই বিকল্প পদ্ধতিতে কীওয়ার্ডটি ব্যবহার করা হয় বলে আমি মনে করি বিভ্রান্তি কাটবে। যদিও একটি লেবেলযুক্ত ব্লক থেকে অন্যটিতে পড়ার সমস্যা হতে পারে তবে আমি ভাগ করে নেওয়া কোডের সাথে একই হ্যান্ডলিং সহ একাধিক কেস ব্যবহার পছন্দ করি।
বিকাশকারীরা

সি এর একাধিক উদ্দেশ্যে একই কীওয়ার্ড ব্যবহার করার দীর্ঘ traditionতিহ্য রয়েছে। চিন্তা করুন *, &, staticইত্যাদি
idrougge
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.