ทำไมเราต้องใช้เบรกสวิตช์?


74

ใครเป็นผู้ตัดสินใจ (และขึ้นอยู่กับแนวคิดใด) ที่การswitchก่อสร้าง (ในหลายภาษา) ต้องใช้breakในแต่ละข้อความ

ทำไมเราต้องเขียนสิ่งนี้:

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

(สังเกตสิ่งนี้ใน PHP และ JS อาจมีหลายภาษาที่ใช้สิ่งนี้)

ถ้าswitchเป็นทางเลือกifทำไมเราไม่สามารถใช้สิ่งก่อสร้างเดียวกันนี้เพื่อif? เช่น:

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

มันบอกว่าbreakป้องกันการดำเนินการของบล็อกต่อไปนี้ในปัจจุบัน แต่มีบางคนวิ่งเข้ามาในสถานการณ์จริงๆแล้วมีความจำเป็นในการดำเนินการของบล็อกปัจจุบันและบล็อกใดบ้าง ฉันไม่ได้ สำหรับฉันbreakอยู่ที่นั่นเสมอ ในทุกช่วงตึก ในทุกรหัส


1
ตามที่ระบุไว้ในคำตอบส่วนใหญ่แล้วสิ่งนี้เกี่ยวข้องกับ 'fall-through' ซึ่งเงื่อนไขหลายอย่างถูกส่งผ่านบล็อก 'then' เดียวกัน อย่างไรก็ตามนี่คือการพึ่งพาภาษา - RPG ตัวอย่างเช่นปฏิบัติกับCASEคำสั่งที่เทียบเท่ากับบล็อกยักษ์ if / elseif
Clockwork-Muse

34
มันเป็นการตัดสินใจที่ไม่ดีของนักออกแบบ C (เช่นการตัดสินใจหลายอย่างทำให้ต้องเปลี่ยนจากการประกอบ -> C และการแปลกลับง่ายกว่าแทนที่จะง่ายในการเขียนโปรแกรม)ซึ่งโชคไม่ดีที่สืบทอดมา ในภาษา C-based อื่น ๆ การใช้กฎง่าย ๆ"กำหนดให้กรณีทั่วไปเป็นค่าเริ่มต้นเสมอ !!" เราจะเห็นได้ว่าพฤติกรรมเริ่มต้นควรจะหยุดลงโดยมีคำหลักแยกต่างหากสำหรับการล้มเนื่องจากเป็นกรณีที่พบบ่อยที่สุด
BlueRaja - Danny Pflughoeft

4
ฉันเคยใช้การล้มหลายต่อหลายครั้งถึงแม้ว่าคำสั่งสวิตช์ในภาษาที่ฉันต้องการ ณ เวลา (C) อาจได้รับการออกแบบมาเพื่อหลีกเลี่ยง เช่นที่ฉันได้ทำแต่ส่วนใหญ่เพราะผมไม่สามารถทำcase 'a': case 'A': case 'b': case 'B' case in [ 'a', 'A', 'b', 'B' ]คำถามที่ดีกว่าเล็กน้อยคือในภาษาที่ฉันต้องการในปัจจุบัน (C #) การหยุดพักเป็นสิ่งที่ จำเป็นและไม่มีการตกลงมาโดยปริยาย การลืมbreakเป็นข้อผิดพลาดทางไวยากรณ์ ... : \
KutuluMike

1
Fall-through พร้อมรหัสจริงมักจะพบในการใช้งาน parser case TOKEN_A: /*set flag*/; case TOKEN_B: /*consume token*/; break; case TOKEN_C: /*...*/
OrangeDog

1
@ BlueRaja-DannyPflughoeft: C ได้รับการออกแบบมาเพื่อให้ง่ายต่อการรวบรวม “ ปล่อยให้กระโดดถ้าbreakอยู่ที่ใดก็ได้” เป็นกฎที่ง่ายกว่าในการใช้มากกว่า“ อย่าปล่อยให้กระโดดถ้าfallthroughอยู่ในที่switch
Jon Purdy

คำตอบ:


95

C เป็นหนึ่งในภาษาแรกที่มีswitchคำสั่งในรูปแบบนี้และภาษาหลักอื่น ๆ ทั้งหมดสืบทอดมาจากที่นั่นส่วนใหญ่เลือกที่จะเก็บความหมายของ C ต่อค่าเริ่มต้น - พวกเขาไม่คิดว่าข้อดีของการเปลี่ยนแปลงหรือตัดสิน พวกเขามีความสำคัญน้อยกว่าการรักษาพฤติกรรมที่ทุกคนคุ้นเคย

สำหรับสาเหตุที่ C ถูกออกแบบมาอย่างนั้นมันอาจเกิดจากแนวคิดของ C ในฐานะ "ชุดประกอบแบบพกพา" switchคำสั่งนั้นเป็นนามธรรมของตารางสาขาและโต๊ะสาขานอกจากนี้ยังมีนัยฤดูใบไม้ร่วงผ่านและต้องมีการเรียนการสอนกระโดดเพิ่มเติมเพื่อหลีกเลี่ยงมัน

โดยพื้นฐานแล้วผู้ออกแบบของ C ยังเลือกที่จะรักษาความหมายของแอสเซมเบลอร์ต่อค่าเริ่มต้น


3
VB.NET เป็นตัวอย่างของภาษาที่เปลี่ยนแปลง ไม่มีอันตรายจากการที่มันไหลเข้าไปในข้อกรณี
โผล่

1
Tcl เป็นอีกภาษาที่ไม่เคยผ่านมาในตอนต่อไป แทบไม่ต้องการทำเช่นนั้น (ต่างจาก C ซึ่งมีประโยชน์เมื่อเขียนโปรแกรมบางประเภท)
Donal Fellows

4
ภาษาบรรพบุรุษของ C, BและBCPL ที่เก่ากว่าทั้งสองมี (มี?) สลับข้อความ BCPL switchonสะกดมัน
Keith Thompson

คำแถลงกรณีของ Ruby ไม่ได้ผ่านไป 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ฉันไม่เห็นด้วยกับคุณ
Satish Pandey

2
@DanielB มันขึ้นอยู่กับภาษาว่า; คำสั่ง C # switch ไม่อนุญาตสำหรับความเป็นไปได้นั้น
แอนดี้

5
@ แอนดี้พวกเรากำลังพูดถึงเรื่องการตกยัง? C # งบสวิตช์แน่นอนอนุญาตไว้ (ตรวจสอบตัวอย่างที่ 3) breakจึงจำเป็นที่จะต้อง แต่ใช่เท่าที่ฉันทราบอุปกรณ์ของ Duff ไม่ทำงานใน C #
แดเนียล B

8
@DanielB ใช่เราเป็น แต่คอมไพเลอร์จะไม่อนุญาตให้มีเงื่อนไขรหัสและเงื่อนไขอื่นโดยไม่หยุดพัก คุณสามารถมีเงื่อนไข mutliple ซ้อนกันโดยไม่มีรหัสระหว่างหรือคุณต้องการหยุดพัก C# does not support an implicit fall through from one case label to anotherจากการเชื่อมโยงของคุณ คุณสามารถผ่านพ้นไปได้ แต่ไม่มีโอกาสลืมโดยไม่ตั้งใจ
แอนดี้

3
@Matsemann .. ตอนนี้เราสามารถทำทุกสิ่งที่ใช้if..elseแต่ในบางสถานการณ์switch..caseจะดีกว่า ตัวอย่างข้างต้นจะซับซ้อนเล็กน้อยถ้าเราใช้ if-else
Satish Pandey

15

มีการถามเรื่อง Stack Overflow ในบริบทของ C: เพราะเหตุใดคำสั่ง switch จึงถูกออกแบบมาให้ต้องหยุดพัก?

เพื่อสรุปคำตอบที่ยอมรับอาจเป็นความผิดพลาด ภาษาอื่นส่วนใหญ่อาจติดตาม C อย่างไรก็ตามบางภาษาเช่น C # ดูเหมือนจะแก้ไขปัญหานี้โดยอนุญาตให้ล้มลง - แต่เฉพาะเมื่อโปรแกรมเมอร์บอกอย่างชัดเจน (แหล่งที่มา: ลิงก์ด้านบนฉันไม่พูด C # ด้วยตนเอง) .


Google Go ทำสิ่งเดียวกัน IIRC (อนุญาตให้มีการผิดพลาดหากระบุไว้อย่างชัดเจน)
Leo

PHP ทำเช่นกัน ยิ่งคุณมองรหัสผลลัพธ์มากเท่าไหร่มันก็ยิ่งทำให้คุณรู้สึกแย่ลงเท่านั้น ฉันชอบ/* FALLTHRU */ความคิดเห็นในคำตอบที่ลิงก์โดย @Tapio ด้านบนเพื่อพิสูจน์ว่าคุณหมายถึงมัน
DaveP

1
การบอกว่า C # มีgoto caseเหมือนที่ลิงค์ทำไม่ได้แสดงว่าทำไมมันถึงได้ผลดี คุณยังสามารถซ้อนหลายกรณีเช่นด้านบนได้ แต่ทันทีที่คุณแทรกรหัสคุณต้องมีตัวอักษรที่ชัดเจนgoto case whateverในกรณีถัดไปหรือคุณได้รับคอมไพเลอร์ eror goto caseถ้าคุณถามผมของทั้งสองความสามารถในการสแต็คกรณีโดยไม่ต้องกังวลเกี่ยวกับการล่มสลายโดยไม่ได้ตั้งใจผ่านโดยประมาทคือไกลโดยมีคุณสมบัติที่ดีกว่าการเปิดใช้งานอย่างชัดเจนฤดูใบไม้ร่วงผ่านด้วย
Jesper

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;
}

นี่คือตัวอย่างที่หลายกรณีมีผลเหมือนกันและถูกจัดกลุ่มเข้าด้วยกัน เห็นได้ชัดว่ามีเหตุผลสำหรับการเลือกคำหลักพักและไม่ใช่ ถ้า ... อื่นถ้าสร้าง

สิ่งสำคัญที่ควรทราบที่นี่คือคำสั่งswitch ที่มีหลายกรณีที่คล้ายกันไม่ใช่ถ้า ... อื่นถ้า ... อื่นถ้า ... อีกถ้าสำหรับแต่ละกรณี แต่ถ้า (1, 2, 3) ... อื่นถ้า (4,5,6) อื่น ...


2
ตัวอย่างของคุณดู verbose มากกว่าแบบifไม่มีประโยชน์ใด ๆ บางทีถ้าตัวอย่างของคุณมอบหมายชื่อหรือทำงานเฉพาะเดือนนอกเหนือจากการเลื่อนผ่านยูทิลิตี้การเลื่อนผ่านจะชัดเจนขึ้นหรือไม่ (โดยไม่ต้องแสดงความคิดเห็นว่าควรจะเป็นหนึ่งในสถานที่แรก)
horatio

1
มันเป็นความจริง. อย่างไรก็ตามฉันแค่พยายามแสดงกรณีที่สามารถใช้งานได้ เห็นได้ชัดว่ามันจะดีกว่ามากถ้าแต่ละเดือนต้องการสิ่งที่ทำแยกกัน
Awemo

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และผู้แยกวิเคราะห์ภาษารู้ว่าตัวเรือนที่ว่างเปล่าล้มลงในขณะที่ตัวเรือนที่ไม่ว่างเปล่าเป็นแบบสแตนด์อโลน

เป็นเรื่องที่น่าเสียดายที่ ISO C พาเนลดูเหมือนจะหมกมุ่นอยู่กับการเพิ่มคุณสมบัติใหม่ (ที่ไม่ต้องการ) และการกำหนดภาษาที่ไม่ดีแทนที่จะแก้ไขคุณลักษณะที่ไม่ได้กำหนดไม่ได้ระบุหรือไม่ได้กำหนดไว้


2
ขอบคุณพระเจ้า ISO C ที่ไม่ได้นำเสนอการเปลี่ยนแปลงที่สำคัญในภาษา!
Jack Aidley

4

ไม่บังคับbreakให้มีหลายสิ่งที่อาจเป็นเรื่องยากที่จะทำ อื่น ๆ ได้บันทึกกรณีการจัดกลุ่มซึ่งมีจำนวนคดีที่ไม่สำคัญ

กรณีหนึ่งที่มันเป็นความจำเป็นที่breakไม่สามารถใช้เป็นอุปกรณ์ของดัฟฟ์ สิ่งนี้ใช้เพื่อ " ปลด " ลูปที่สามารถเร่งความเร็วการดำเนินการโดย จำกัด จำนวนการเปรียบเทียบที่ต้องการ ฉันเชื่อว่าการใช้งานครั้งแรกอนุญาตให้ใช้งานได้ซึ่งก่อนหน้านี้ช้าเกินไปกับลูปแบบเต็ม มันมีการซื้อขายขนาดรหัสเพื่อความรวดเร็วในบางกรณี

มันเป็นวิธีที่ดีในการแทนที่breakด้วยความคิดเห็นที่เหมาะสมหากกรณีมีรหัสใด ๆ มิฉะนั้นจะมีคนแก้ไขbreakข้อผิดพลาดที่หายไปและแนะนำบั๊ก


ขอบคุณสำหรับตัวอย่างอุปกรณ์ของ Duff (+1) ฉันไม่ทราบว่า
trejder

3

ใน C ซึ่งดูเหมือนว่าจุดเริ่มต้นบล็อกโค้ดของswitchคำสั่งไม่ใช่โครงสร้างพิเศษ มันเป็นบล็อกปกติของรหัสเช่นเดียวกับบล็อกภายใต้ifคำสั่ง

switch ()
{
}

if ()
{
}

caseและมีป้ายกระโดดภายในบล็อกนี้เฉพาะที่เกี่ยวข้องกับdefault พวกเขาได้รับการจัดการเช่นเดียวกับป้ายกระโดดปกติswitch gotoมีกฎเฉพาะข้อเดียวที่สำคัญที่นี่: ป้ายกำกับการกระโดดสามารถเกือบทุกที่ในรหัสโดยไม่รบกวนการไหลของรหัส

ในฐานะที่เป็นบล็อกรหัสปกติมันไม่จำเป็นต้องเป็นคำสั่งผสม ฉลากก็เป็นทางเลือกเช่นกัน นี่เป็นswitchข้อความที่ถูกต้องใน C:

switch (a)
    case 1: Foo();

switch (a)
    Foo();

switch (a)
{
    Foo();
}

มาตรฐาน C ให้สิ่งนี้เป็นตัวอย่าง (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); 
} 

ในชิ้นส่วนของโปรแกรมประดิษฐ์วัตถุที่มีตัวระบุคือ i อยู่กับระยะเวลาการจัดเก็บอัตโนมัติ (ภายในบล็อก) แต่ไม่เคยเริ่มต้นและดังนั้นถ้าการแสดงออกการควบคุมมีค่าที่ไม่ใช่ศูนย์การเรียกไปยังฟังก์ชั่น printf จะเข้าถึงค่าไม่แน่นอน ในทำนองเดียวกันการเรียกฟังก์ชัน f ไม่สามารถเข้าถึงได้

นอกจากนี้ยังdefaultเป็นป้ายกำกับการกระโดดด้วยและสามารถอยู่ได้ทุกที่โดยไม่จำเป็นต้องเป็นคดีสุดท้าย

สิ่งนี้ยังอธิบายถึงอุปกรณ์ของ Duff:

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");
    }
}

มาตรฐาน C ใส่ใจในเรื่องนี้ (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())
ไมค์ 'Pomax' Kamermans

กล่าวอีกนัยหนึ่ง, doSomething[ThatShouldBeDoneInTheCaseOf]1And[InTheCaseOf]2(). มันไม่ได้หมายถึงตรรกะและ / หรือ
Panzercrisis

ฉันรู้ว่ามันไม่ใช่ แต่ให้เหตุผลว่าทำไมผู้คนถึงสับสนกับรหัสประเภทนี้มันควรจะอธิบายอย่างแน่นอนว่า "และ" นั้นเป็นเพราะการพึ่งพาใครสักคนที่จะคาดเดา "ธรรมชาติและ" เทียบกับ "ปลายตรรกะ" ในคำตอบที่ใช้งานได้เท่านั้น เมื่ออธิบายอย่างแม่นยำต้องการคำอธิบายเพิ่มเติมในคำตอบหรือเขียนชื่อฟังก์ชั่นใหม่เพื่อลบความกำกวมนั้น =)
Mike 'Pomax' Kamermans

1

เพื่อตอบคำถามสองข้อของคุณ

ทำไม C ถึงต้องหยุดพัก?

มันลงมาที่ Cs ในฐานะ "แอสเซมเบลอร์แบบพกพา" รหัส psudo เช่นนี้เป็นเรื่องธรรมดา: -

    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:
    ......

คำสั่ง switch ถูกออกแบบมาเพื่อให้การทำงานที่คล้ายกันในระดับที่สูงขึ้น

เราเคยมีสวิตช์โดยไม่หยุดพักหรือไม่?

ใช่นี่เป็นเรื่องปกติและมีบางกรณีที่ใช้;

ประการแรกคุณอาจต้องการดำเนินการเดียวกันหลายกรณี เราทำสิ่งนี้โดยการซ้อนกรณีบนสุดของกันและกัน:

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

กรณีการใช้งานอื่นที่พบได้ทั่วไปในเครื่องจักรของรัฐคือหลังจากประมวลผลสถานะหนึ่งเราต้องการป้อนและประมวลผลสถานะอื่นทันที:

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

-2

คำสั่ง Break เป็นคำสั่งกระโดดที่อนุญาตให้ผู้ใช้ออกจากสวิตช์ล้อมรอบที่ใกล้ที่สุด (สำหรับกรณีของคุณ) ขณะที่ทำทำเพื่อหรือก่อน มันง่ายอย่างที่คิด


-3

ฉันคิดว่าด้วยการเขียนทั้งหมดข้างต้น - ผลลัพธ์หลักของเธรดนี้คือถ้าคุณต้องการออกแบบภาษาใหม่ - ค่าเริ่มต้นควรเป็นว่าคุณไม่จำเป็นต้องเพิ่มbreakคำสั่งและคอมไพเลอร์จะปฏิบัติต่อราวกับว่าคุณทำ

หากคุณต้องการกรณีที่หายากที่คุณต้องการที่จะดำเนินการในกรณีต่อไป - เพียงแค่ระบุด้วยcontinueคำสั่ง

นี้สามารถปรับปรุงเพื่อให้เท่านั้นถ้าคุณใช้วงเล็บปีกกาภายในกรณีนี้แล้วมันไม่ได้ไปบนเพื่อให้ตัวอย่างกับเดือนข้างต้นของหลายกรณีการแสดงรหัสที่แน่นอนเดียวกัน - มักจะทำงานตามที่คาดโดยไม่จำเป็นต้องcontinue


2
ฉันไม่แน่ใจว่าฉันเข้าใจคำแนะนำของคุณที่เกี่ยวข้องกับคำสั่งดำเนินการต่อ ดำเนินการต่อมีความหมายแตกต่างกันมากใน C และ C ++ และหากภาษาใหม่เป็นเหมือน C แต่ใช้คำหลักบางครั้งเช่นเดียวกับ C และบางครั้งในทางเลือกนี้ฉันคิดว่าความสับสนจะขึ้นครองราชย์ ในขณะที่อาจมีปัญหาบางอย่างเกี่ยวกับการตกลงจากบล็อกที่มีป้ายกำกับหนึ่งไปยังบล็อกอื่นฉันชอบการใช้หลายกรณีที่มีการจัดการเดียวกันกับบล็อกที่แชร์รหัส
DeveloperDon

C มีประเพณีอันยาวนานในการใช้คำหลักเดียวกันสำหรับหลาย ๆ วัตถุประสงค์ คิดว่า*, &, staticฯลฯ
idrougge
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.