Ganti huruf besar/kecil dengan operator logika di C

Saya baru mengenal C dan butuh bantuan. Kode saya adalah sebagai berikut.

 #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();
  }

Saya bekerja di Turbo C dan hasilnya adalah helloI thought somebody. Tidak ada pesan kesalahan.

Tolong, beri tahu saya cara kerjanya.


person Er Avinash Singh    schedule 05.11.2012    source sumber
comment
Anda harus bertemu teman-teman saya: Enter dan Space Bar. Mereka benar-benar mengagumkan dan dapat membuat kode Anda juga keren jika Anda memintanya dengan baik.   -  person Jeff Mercado    schedule 05.11.2012
comment
@BobKaufman Saya hanya mengedit sebagian - sebagian tidak pernah disimpan. Terima kasih DaoWen juga :-)   -  person Aniket Inge    schedule 05.11.2012
comment
Anda akan mendapatkan jawaban yang jauh lebih bermanfaat jika Anda menjelaskan apa yang Anda harapkan dan alasannya. Saya dapat memikirkan beberapa cara berbeda yang mungkin tidak sesuai dengan harapan Anda, dan sangat mungkin Anda mengharapkan sesuatu yang sama sekali berbeda. Saya tidak yakin bagaimana kami dapat menjelaskan mengapa ini tidak sesuai dengan harapan Anda tanpa mengetahui apa yang Anda harapkan, selain dengan menebak dengan benar. (Apakah Anda mengharapkan case 1||2: bertindak seperti case 3:? Atau seperti case 1: case 2:? Atau apa?)   -  person David Schwartz    schedule 05.11.2012
comment
@Er -- di luar format, ini adalah pertanyaan pertama yang bagus. Ekstrak singkat yang bagus, lengkap dengan keluaran yang Anda peroleh dan menyebutkan tidak ada kesalahan. Saya berharap semua orang memposting pertanyaan sebaik ini.   -  person Jeremy J Starcher    schedule 05.11.2012
comment
juga, harap tulis int main(void) dan berhenti menggunakan void main() dan yang lebih penting, berhenti menggunakan TurboC   -  person Aniket Inge    schedule 05.11.2012
comment
@Aniket: - ya sebenarnya saya menggunakan gcc di linux tetapi karena sistem saya sedang down, saya tidak punya pilihan.   -  person Er Avinash Singh    schedule 05.11.2012
comment
oke saya akan menerapkannya, terima kasih.   -  person Er Avinash Singh    schedule 05.11.2012
comment
@ErAvinashSingh Anda punya pilihan, Anda dapat menggunakan GCC di windows dengan MinGW atau Cygwin   -  person Aniket Inge    schedule 05.11.2012
comment
Anda juga dapat mengunduh Visual Studio 2012 Express untuk Desktop dan hackaway!   -  person Aniket Inge    schedule 05.11.2012
comment
Kemungkinan duplikat Pernyataan peralihan menggunakan atau   -  person Rodrigo de Azevedo    schedule 12.06.2018


Jawaban (5)


case 1||2:

Menjadi true. jadi menjadi case 1: tetapi nilai yang diteruskan adalah 2. jadi kasus default dijalankan. Setelah itu printf("I thought somebody"); Anda dieksekusi.

person Jeyaram    schedule 05.11.2012
comment
+1 untuk menjelaskan mengapa kode OP tidak berfungsi seperti yang diharapkannya. - person Jeremy J Starcher; 05.11.2012
comment
ya, saya pikir itu berfungsi seperti kasus 1 atau 2 .. tapi sepertinya itu berfungsi sebaliknya - person Er Avinash Singh; 05.11.2012

melakukan hal ini:

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

Ini akan menjadi cara yang lebih bersih untuk melakukan itu. Ekspresi 1||2 dievaluasi menjadi 1, karena suite adalah 2, ekspresi tersebut tidak akan cocok dengan 1 atau 3, dan melompat ke kasus default.

person Aniket Inge    schedule 05.11.2012
comment
@JeffMercado terima kasih, saya mungkin akan melihat cara kerjanya. Pria 8 tahun dengan C dan sesuatu darinya masih muncul kembali dan menyekolahkan saya - person Aniket Inge; 05.11.2012
comment
Aniket - Karena tidak ada tipe boolean di C (hanya int), kompiler akan melakukan pelipatan konstan pada 1||2, seperti yang dilakukan pada 0+1, dan Anda akan mendapatkan case 1 daripada 1 atau 2 yang mungkin diharapkan pengguna jika mereka berasal dari bahasa dengan pola lengkap yang cocok dengan alternatif. - person DaoWen; 05.11.2012
comment
ah ya @DaoWen saya memeriksa dengan kompiler saya. 1||2 bernilai 1, yang mana benar. Dan... - person Aniket Inge; 05.11.2012

case 1||2:

Hasil di

case 1:

karena 1 || 2 dievaluasi menjadi 1 (dan ingat; hanya ekspresi integral konstan yang diperbolehkan dalam pernyataan case, jadi Anda tidak dapat memeriksa beberapa nilai dalam satu case).

Anda ingin menggunakan:

case 1:
  // fallthrough
case 2:
person Ed S.    schedule 05.11.2012
comment
1||2 adalah sebuah konstanta. Kompiler, pada titik tertentu, akan mengurangi nilai tersebut. Kemungkinan besar pada waktu parse. - person Jeremy J Starcher; 05.11.2012
comment
@JeremyJStarcher: Saya tidak bermaksud mengatakan itu bukan (dan saya menunjukkan apa yang direduksi dalam contoh pertama saya), saya pikir OP menginginkan kasus yang sama untuk 1 dan 2. Namun, membacanya lagi, saya tentu saja mengatakannya dengan cara yang membingungkan. Saya akan memperbaikinya, terima kasih. - person Ed S.; 06.11.2012
comment
hal. Saya tahu saya suka jika orang memperketat kata-kata saya. - person Jeremy J Starcher; 06.11.2012

Anda switch pada nilai 2, yang cocok dengan huruf default dalam pernyataan switch, sehingga ia mencetak "halo" dan kemudian baris terakhir mencetak "Saya pikir seseorang".

person stefanB    schedule 05.11.2012

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

Cukup letakkan tanda kurung dan lihat keajaibannya.

Dalam kode Anda, program hanya memeriksa nilai pertama dan turun. Karena, program tidak menemukan 2 setelah itu masuk ke huruf default.

Namun jika Anda menentukan bahwa kedua suku yaitu 1 dan 2 bersamaan, menggunakan tanda kurung, maka akan berjalan sesuai keinginan.

person Harpreet Vishnoi    schedule 20.09.2016