kzen.dev
  • Pertanyaan
  • Tag
  • Pengguna
Notifikasi
Imbalan
Registrasi
Setelah Anda mendaftar, Anda akan diberitahu tentang balasan dan komentar untuk pertanyaan Anda.
Gabung
Jika Anda sudah memiliki akun, masuk untuk memeriksa pemberitahuan baru.
Akan ada hadiah untuk pertanyaan, jawaban, dan komentar tambahan.
Lebih
Sumber
Sunting
 user982209
user982209
Question

Beberapa kondisi dalam kasus sakelar?

Dapatkah saya menggunakan switch case untuk memeriksa beberapa kondisi? seperti misalnya salah satu atau dari kondisi yang terpenuhi maka akan melakukan case-nya?

switch (conditionA or conditionB fullfilled)
  { //execute code }
12 2011-12-27T11:23:51+00:00 3
Pemrograman
c++
loops
switch-statement
Pertanyaan ini memiliki :value jawaban dalam bahasa Inggris, untuk membacanya masuk ke akun Anda.
Mike Nakis
Mike Nakis
27 Desember 2011 в 11:25
2011-12-27T11:25:50+00:00
Lebih
Sumber
Sunting
#15057120

Jelas, pertanyaan tentang bagaimana mengeksekusi kode jika kondisiA atau kondisiB adalah benar dapat dijawab secara trivial dengan jika (kondisiA || kondisiB) ``, tidak ada pernyataanswitchyang diperlukan. Dan jika pernyataanswitchuntuk beberapa alasan harus dimiliki, maka pertanyaannya dapat dijawab secara trivial dengan menyarankan labelcase` jatuh, seperti yang dilakukan oleh salah satu jawaban lainnya.

Saya tidak tahu apakah kebutuhan OP sepenuhnya tercakup dalam jawaban-jawaban sepele ini, tetapi pertanyaan ini akan dibaca oleh banyak orang selain OP, jadi saya ingin menyajikan solusi yang lebih umum yang dapat menyelesaikan banyak masalah serupa yang jawaban sepele tidak akan bisa dilakukan.

Cara menggunakan pernyataan switch tunggal untuk memeriksa nilai dari sejumlah kondisi boolean yang berubah-ubah pada saat yang sama.

Ini memang hacky, tetapi mungkin akan berguna.

Caranya adalah dengan mengkonversi nilai benar / salah dari setiap kondisi Anda menjadi bit, menggabungkan bit-bit ini menjadi nilai int, dan kemudian switch pada nilai int.

Berikut ini beberapa contoh kode:

#define A_BIT (1 << 0)
#define B_BIT (1 << 1)
#define C_BIT (1 << 2)

switch( (conditionA? A_BIT : 0) | (conditionB? B_BIT : 0) | (conditionC? C_BIT : 0) )
{
     case 0:                     //none of the conditions holds true.
     case A_BIT:                 //condition A is true, everything else is false.
     case B_BIT:                 //condition B is true, everything else is false.
     case A_BIT + B_BIT:         //conditions A and B are true, C is false.
     case C_BIT:                 //condition C is true, everything else is false.
     case A_BIT + C_BIT:         //conditions A and C are true, B is false.
     case B_BIT + C_BIT:         //conditions B and C are true, A is false.
     case A_BIT + B_BIT + C_BIT: //all conditions are true.
     default: assert( FALSE );   //something went wrong with the bits.
}

Kemudian, Anda dapat menggunakan label case jika Anda memiliki skenario either-or. Sebagai contoh:

switch( (conditionA? A_BIT : 0) | (conditionB? B_BIT : 0) | (conditionC? C_BIT : 0) )
{
     case 0:
         //none of the conditions is true.
         break;
     case A_BIT:
     case B_BIT:
     case A_BIT + B_BIT:
         //(either conditionA or conditionB is true,) and conditionC is false.
         break;
     case C_BIT:
         //condition C is true, everything else is false.
         break;
     case A_BIT + C_BIT:
     case B_BIT + C_BIT:
     case A_BIT + B_BIT + C_BIT:
         //(either conditionA or conditionB is true,) and conditionC is true.
         break;
     default: assert( FALSE );   //something went wrong with the bits.
}

.

Mike Nakis
Mike Nakis
Jawaban edit 23 September 2017 в 1:44
23
0
Solution / Answer
 citxx
citxx
27 Desember 2011 в 11:31
2011-12-27T11:31:41+00:00
Lebih
Sumber
Sunting
#15057121

Tidak. Dalam c++ switch case hanya dapat digunakan untuk memeriksa nilai dari satu variabel untuk kesetaraan:

switch (var) {
    case value1: /* ... */ break;
    case value2: /* ... */ break;
    /* ... */
}

Tetapi Anda dapat menggunakan beberapa switch:

switch (var1) {
    case value1_1:
        switch (var2) {
            /* ... */
        }
        break;
    /* ... */
}
16
0
 Konstantin
Konstantin
5 Februari 2014 в 12:04
2014-02-05T00:04:12+00:00
Lebih
Sumber
Sunting
#15057122

Bagaimana dengan fitur fall-through dari konstruk sakelar/kasus?

switch(condition){
    case case1:
        // do action for case1
        break;
    case case2:
    case case3:
        // do common action for cases 2 and 3
        break;
    default:
        break;
}
10
0
Tambahkan pertanyaan
Kategori
Semua
Teknologi
Budaya / Rekreasi
Kehidupan / Seni
Ilmu Pengetahuan
Profesional
Bisnis
Pengguna
Semua
Baru
Populer
1
工藤 芳則
Terdaftar 6 hari yang lalu
2
Ирина Беляева
Terdaftar 1 minggu yang lalu
3
Darya Arsenyeva
Terdaftar 1 minggu yang lalu
4
anyta nuam-nuam (LapuSiK)
Terdaftar 1 minggu yang lalu
5
Shuhratjon Imomkulov
Terdaftar 1 minggu yang lalu
ID
JA
© kzen.dev 2023
Sumber
stackoverflow.com
di bawah lisensi cc by-sa 3.0 dengan atribusi