สลับเคสด้วยตัวดำเนินการเชิงตรรกะใน C

ฉันยังใหม่กับ C และต้องการความช่วยเหลือ รหัสของฉันมีดังต่อไปนี้

 #include<stdio.h>  
 #include<conio.h>  
 void main()
 {

  int suite=2;  

  switch(suite)
     {           
      case 1||2:
      printf("hi");

      case 3:
      printf("byee");

      default:
      printf("hello");
     }

  printf("I thought somebody");
  getche();
  }

ฉันทำงานใน Turbo C และผลลัพธ์คือ helloI thought somebody ไม่มีข้อความแสดงข้อผิดพลาด

กรุณาแจ้งให้เราทราบวิธีการทำงานนี้


person Er Avinash Singh    schedule 05.11.2012    source แหล่งที่มา
comment
คุณควรพบเพื่อนของฉัน: Enter และ Space Bar มันยอดเยี่ยมมากและสามารถทำให้โค้ดของคุณยอดเยี่ยมได้เช่นกันหากคุณถามพวกเขาอย่างดี   -  person Jeff Mercado    schedule 05.11.2012
comment
@BobKaufman ฉันแก้ไขเพียงบางส่วนเท่านั้น - บางส่วนไม่เคยถูกบันทึก ขอบคุณ DaoWen เช่นกัน :-)   -  person Aniket Inge    schedule 05.11.2012
comment
คุณจะได้รับคำตอบที่เป็นประโยชน์มากขึ้นหากคุณอธิบายสิ่งที่คุณคาดหวังและเหตุผล ฉันคิดได้หลายวิธีซึ่งอาจไม่เป็นไปตามที่คุณคาดหวัง และอาจเป็นไปได้โดยสิ้นเชิงว่าคุณคาดหวังอย่างอื่นโดยสิ้นเชิง ฉันไม่แน่ใจว่าเราจะอธิบายได้อย่างไรว่าทำไมสิ่งนี้จึงไม่เป็นไปตามที่คุณคาดหวังโดยไม่รู้ว่าคุณคาดหวังอะไร นอกเหนือจากการคาดเดาให้ถูกต้อง (คุณคาดหวังให้ case 1||2: ทำตัวเหมือน case 3: หรือเหมือน case 1: case 2: หรืออะไรนะ?)   -  person David Schwartz    schedule 05.11.2012
comment
@Er - นอกเหนือจากการจัดรูปแบบ นี่เป็นคำถามแรกที่ดี สารสกัดสั้นๆ ที่ดี พร้อมด้วยผลลัพธ์ที่คุณได้รับและการกล่าวถึงว่าไม่มีข้อผิดพลาด ฉันหวังว่าทุกคนจะโพสต์คำถามที่ดีนี้   -  person Jeremy J Starcher    schedule 05.11.2012
comment
นอกจากนี้โปรดเขียน int main(void) และหยุดใช้ void main() และที่สำคัญกว่านั้นคือหยุดใช้ TurboC   -  person Aniket Inge    schedule 05.11.2012
comment
@Aniket:- ใช่จริงๆ แล้วฉันใช้ gcc บน linux แต่เนื่องจากระบบของฉันล่ม ฉันจึงไม่มีทางเลือก   -  person Er Avinash Singh    schedule 05.11.2012
comment
โอเค ฉันจะดำเนินการตามนั้น ขอบคุณ   -  person Er Avinash Singh    schedule 05.11.2012
comment
@ErAvinashSingh คุณมีทางเลือก คุณสามารถใช้ GCC บน windows ด้วย MinGW หรือ Cygwin   -  person Aniket Inge    schedule 05.11.2012
comment
คุณยังสามารถดาวน์โหลด Visual Studio 2012 Express สำหรับเดสก์ท็อปและแฮ็กอะเวย์ได้!   -  person Aniket Inge    schedule 05.11.2012
comment
อาจซ้ำกันของ สลับคำสั่งโดยใช้หรือ   -  person Rodrigo de Azevedo    schedule 12.06.2018


คำตอบ (5)


case 1||2:

กลายเป็น true ดังนั้นมันจึงกลายเป็น case 1: แต่ค่าที่ส่งผ่านคือ 2 ดังนั้นจึงดำเนินการตามตัวพิมพ์เริ่มต้น หลังจากนั้น printf("I thought somebody"); ของคุณก็ถูกดำเนินการ

person Jeyaram    schedule 05.11.2012
comment
+1 สำหรับการอธิบายว่าทำไมรหัส OPs จึงไม่เป็นไปตามที่เขาคาดไว้ - person Jeremy J Starcher; 05.11.2012
comment
ใช่แล้ว ฉันคิดว่ามันจะทำงานเหมือนกับเคส 1 หรือ 2 .. แต่ดูเหมือนว่าจะทำงานเป็นอย่างอื่น - person Er Avinash Singh; 05.11.2012

ทำเช่นนี้:

switch(suite){
  case 1:/*fall through*/
  case 2: 
    printf("Hi");
...
}

นี่จะเป็นวิธีที่สะอาดกว่ามากในการทำเช่นนั้น นิพจน์ 1||2 ประเมินค่าเป็น 1 เนื่องจาก suite เท่ากับ 2 จึงไม่ตรงกับ 1 หรือ 3 และข้ามไปที่ตัวพิมพ์ default

person Aniket Inge    schedule 05.11.2012
comment
@JeffMercado ขอบคุณ ฉันอาจดูว่ามันทำงานอย่างไร ผู้ชายอายุ 8 ขวบที่มี C และบางอย่างยังคงกลับมาและสอนฉัน - person Aniket Inge; 05.11.2012
comment
Aniket - เนื่องจากไม่มีประเภทบูลีนใน C (เป็นเพียง ints) คอมไพเลอร์จะทำการพับอย่างต่อเนื่องบน 1||2 เช่นเดียวกับที่ทำบน 0+1 และคุณจะได้ case 1 แทนที่จะเป็น 1 หรือ 2 ที่ผู้ใช้อาจคาดหวังได้หากมาจากภาษาที่มีรูปแบบเต็มรูปแบบที่ตรงกับภาษาอื่น - person DaoWen; 05.11.2012
comment
อ่า ใช่ @DaoWen ฉันตรวจสอบกับคอมไพเลอร์แล้ว 1||2 ประเมินเป็น 1 ซึ่งเป็นจริง และ... - person Aniket Inge; 05.11.2012

case 1||2:

ผลลัพธ์ใน

case 1:

เนื่องจาก 1 || 2 ประเมินค่าเป็น 1 (และจำไว้ว่า อนุญาตให้ใช้นิพจน์อินทิกรัลคงที่เท่านั้นในคำสั่ง case ดังนั้น คุณไม่สามารถตรวจสอบค่าหลายค่าใน case เดียวได้)

คุณต้องการใช้:

case 1:
  // fallthrough
case 2:
person Ed S.    schedule 05.11.2012
comment
1||2 เป็นค่าคงที่ คอมไพเลอร์จะต้องลดค่านั้นลงในบางจุด เป็นไปได้มากที่สุดในเวลาแยกวิเคราะห์ - person Jeremy J Starcher; 05.11.2012
comment
@JeremyJStarcher: ฉันไม่ได้ตั้งใจจะบอกว่ามันไม่ใช่ (และฉันแสดงให้เห็นว่ามันลดลงในตัวอย่างแรกของฉัน) ฉันคิดว่า OP ต้องการกรณีเดียวกันสำหรับ 1 และ 2 อย่างไรก็ตามเมื่ออ่านอีกครั้งฉัน พูดอย่างนั้นอย่างสับสนอย่างแน่นอน ฉันจะแก้ไขมัน ขอบคุณ - person Ed S.; 06.11.2012
comment
เอ็นพี. ฉันรู้ว่าฉันชอบเวลาที่มีคนกระชับคำพูดของฉัน - person Jeremy J Starcher; 06.11.2012

คุณ switch อยู่ที่ค่า 2 ซึ่งตรงกับตัวพิมพ์ default ในคำสั่ง switch ดังนั้นจึงพิมพ์ว่า "สวัสดี" จากนั้นบรรทัดสุดท้ายจะพิมพ์ว่า "ฉันคิดว่าใครบางคน"

person stefanB    schedule 05.11.2012

case (1||2):
  printf("hi");

แค่ใส่วงเล็บก็เห็นความมหัศจรรย์แล้ว

ในโค้ดของคุณ โปรแกรมเพียงตรวจสอบค่าแรกและหยุดทำงาน เนื่องจากไม่พบ 2 หลังจากนั้นจึงไปที่ตัวพิมพ์เริ่มต้น

แต่เมื่อคุณระบุว่าทั้งสองคำคือ 1 และ 2 อยู่ด้วยกันโดยใช้วงเล็บ มันก็จะทำงานตามที่คุณต้องการ

person Harpreet Vishnoi    schedule 20.09.2016