คำถามติดแท็ก switch-statement

ในการเขียนโปรแกรมคอมพิวเตอร์คำสั่ง switch, case, select หรือ inspect เป็นชนิดของกลไกการควบคุมการเลือกที่ใช้เพื่อเรียกใช้บล็อกเฉพาะของรหัสตามเนื้อหาตัวแปร

3
สลับกับพฤติกรรมแปลก ๆ var / null
ระบุรหัสต่อไปนี้: string someString = null; switch (someString) { case string s: Console.WriteLine("string s"); break; case var o: Console.WriteLine("var o"); break; default: Console.WriteLine("default"); break; } ทำไมงบเปลี่ยนการจับคู่ในcase var o? เป็นความเข้าใจของฉันที่case string sไม่ตรงกันเมื่อใดs == nullเนื่องจาก (ได้ผล) (null as string) != nullประเมินเป็นเท็จ IntelliSense บน VS Code บอกฉันว่าoเป็นstringเช่นกัน ความคิดใด ๆ ? คล้ายกับ: C # 7 …

7
ใช้ดำเนินการต่อในคำสั่งสวิตช์
ฉันต้องการข้ามจากตรงกลางของ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งบ? C และ C ++ แตกต่างกันในพฤติกรรมของพวกเขาที่นี่หรือไม่?

14
ฉันจะเพิ่มตัวแปรโดยไม่ให้เกินค่าสูงสุดได้อย่างไร
ฉันกำลังทำงานกับโปรแกรมวิดีโอเกมง่ายๆสำหรับโรงเรียนและฉันได้สร้างวิธีการที่ผู้เล่นจะได้รับคะแนนพลังชีวิต 15 แต้มหากเรียกวิธีนั้น ฉันต้องรักษาสุขภาพให้ได้สูงสุด 100 และด้วยความสามารถในการเขียนโปรแกรมที่ จำกัด ของฉัน ณ จุดนี้ฉันกำลังทำอะไรแบบนี้ public void getHealed(){ if(health <= 85) health += 15; else if(health == 86) health += 14; else if(health == 87) health += 13; }// this would continue so that I would never go over 100 ฉันเข้าใจว่าไวยากรณ์ของฉันไม่สมบูรณ์แบบ แต่คำถามของฉันคืออะไรอาจเป็นวิธีที่ดีกว่าในการทำเช่นนี้เพราะฉันต้องทำสิ่งที่คล้ายกันกับจุดความเสียหายและไม่ต่ำกว่า 0 นี้เรียกว่าอิ่มตัวเลขคณิต

2
จะเขียนคำสั่ง Ruby switch (case … when) ด้วย regex และ backreferences ได้อย่างไร?
ฉันรู้ว่าฉันสามารถเขียนคำสั่งกรณี Ruby เพื่อตรวจสอบการจับคู่กับนิพจน์ทั่วไป อย่างไรก็ตามฉันต้องการใช้ข้อมูลที่ตรงกันในคำสั่งส่งคืนของฉัน บางอย่างเช่นรหัสกึ่งเทียมนี้: foo = "10/10/2011" case foo when /^([0-9][0-9])/ print "the month is #{match[1]}" else print "something else" end ฉันจะบรรลุสิ่งนั้นได้อย่างไร? ขอบคุณ! หมายเหตุ: ฉันเข้าใจว่าฉันจะไม่ใช้คำสั่ง switch สำหรับกรณีธรรมดา ๆ ข้างต้น แต่นั่นเป็นเพียงตัวอย่างเดียว ในความเป็นจริงสิ่งที่ฉันพยายามจะบรรลุคือการจับคู่นิพจน์ทั่วไปที่เป็นไปได้สำหรับวันที่ซึ่งสามารถเขียนได้หลายวิธีจากนั้นแยกวิเคราะห์ด้วยคลาส Date ของ Ruby ตามลำดับ

1
เหตุใด GCC จึงเตือนฉันเกี่ยวกับการล้มเหลวแม้ว่าฉันจะใช้ [[fallthrough]]
ในส่วนของโค้ดต่อไปนี้ฉันใช้[[fallthrough]]แอตทริบิวต์มาตรฐานจาก C ++ 1z เพื่อจัดทำเอกสารว่าต้องการการล่มสลาย: #include <iostream> int main() { switch (0) { case 0: std::cout << "a\n"; [[fallthrough]] case 1: std::cout << "b\n"; break; } } ด้วย GCC 7.1 โค้ดจะคอมไพล์โดยไม่มีข้อผิดพลาด อย่างไรก็ตามคอมไพเลอร์ยังคงเตือนฉันเกี่ยวกับการล่มสลาย: warning: this statement may fall through [-Wimplicit-fallthrough=] std::cout << "a\n"; ~~~~~~~~~~^~~~~~~~ ทำไม?

8
กรณีสวิตช์ Java: มีหรือไม่มีวงเล็บปีกกา?
พิจารณาสองตัวอย่างต่อไปนี้โดยใช้วงเล็บปีกกา: switch (var) { case FOO: { x = x + 1; break; } case BAR: { y = y + 1; break; } } โดยไม่ต้องจัดฟัน: switch (var) { case FOO: x = x + 1; break; case BAR: y = y + 1; break; } ฉันรู้ว่าในตัวอย่างข้อมูลที่มีวงเล็บปีกกาจะมีการสร้างขอบเขตใหม่โดยการใส่วงเล็บปีกกาแต่ละกรณี อย่างไรก็ตามหากแต่ละกรณีไม่จำเป็นต้องใช้ขอบเขตใหม่ (เช่นไม่มีการใช้ชื่อตัวแปร) จะมีการลงโทษด้านประสิทธิภาพในการใช้วงเล็บปีกกากับเคสหรือไม่?

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