Pertanyaan Apakah pernyataan sakelar java mengeksekusi beberapa kasus untuk nilai-nilai int negatif?


Saya hanya menjalankan sesuatu yang aneh dalam kode java saya:

switch (result) {
            case 0:
                result_amount = 500;
            case 1:
                result_amount = 600;
            case -1:
                result_amount = 700;
    } 

result adalah dari tipe int primitif. Untuk nilai 1  case 1 dan case -1 dieksekusi.

Apakah ini perilaku tombol switch normal? Jika ya: mengapa?


5
2017-08-12 08:10


asal


Jawaban:


Anda perlu menggunakan break kata kunci setelah a case blok:

switch (result) {
        case 0:
            result_amount = all_amounts[i];
        break;
        case 1:
            result_amount = all_amounts[i];
        break;
        case -1:
            result_amount = all_amounts[i+1];
} 

Itu switch Pernyataan akan membuat lompatan ke yang benar case tag, lalu jalankan semua kode yang mengikuti, mengabaikan potensi lainnya case tag. Anda dapat mempertimbangkan switch pernyataan seperti a goto satu.


8
2017-08-12 08:11



Gagal.

mengutip dari dokumen 

Pernyataan istirahat diperlukan karena tanpa mereka, pernyataan dalam blok beralih jatuh melalui: Semua pernyataan setelah label kasus yang cocok dijalankan secara berurutan, terlepas dari ekspresi label kasus berikutnya, sampai pernyataan istirahat ditemui.

Anda harus menambahkan break setelah setiap kasus.

          case 1:
          result_amount = 600;
          break; 

3
2017-08-12 08:13



Tanpa break pernyataan kasus selanjutnya akan dieksekusi.


0
2017-08-12 08:12



  1. Umumnya Label Kasus Harus Integer / Konstan
  2. Angka negatif yang tidak memiliki titik desimal juga dianggap sebagai Integer
  3. Jadi tidak perlu memiliki Label Kasus lebih besar dari Nol

Ini adalah fall through kondisi.

        switch (result) {
                case 0:
                    result_amount = all_amounts[i];
                case 1:
                    result_amount = all_amounts[i];
                case -1:
                    result_amount = all_amounts[i+1];
        } 

Untuk menghindarinya Anda harus meletakkannya break pernyataan

       switch (result) {
                case 0:
                    result_amount = all_amounts[i];
                    break;
                case 1:
                    result_amount = all_amounts[i];
                    break;
                case -1:
                    result_amount = all_amounts[i+1];
                    break;
        } 

Sekarang hanya casing yang cocok yang akan dieksekusi.


0
2017-08-12 08:18



Ingat:

Ini adalah kesalahan yang hampir setiap pemula akan buat. Itu sebabnya saya suka C # lagi. Itu tidak memungkinkan "jatuh-melalui".

Apa yang Anda lakukan salah adalah Anda jatuh melalui pernyataan switch. Coba gunakan 0 sebagai nilai result. Ini akan melewati semua kasus. Ketika kasus switch selesai dieksekusi, kasus berikutnya dijalankan. Itu sebabnya kita perlu menambahkan break; pernyataan untuk setiap kasus pernyataan switch.

switch (result) {
            case 0:
                result_amount = 500;
                break;
            case 1:
                result_amount = 600;
                break;
            case -1:
                result_amount = 700;
                break;
} 

Tetapi terkadang kita ingin gagal. Misalnya ketika kita ingin menghitung jumlah hari dalam sebulan:

switch (month) {
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
        days = 31;
        break;
    case 2:
        days = 28;
    case 4:
    case 6:
    //Lots of code...
}

0
2017-08-12 08:24



Anda harus memasukkan break dan default untuk menjalankan program dengan cara yang tepat. Biarkan saya memberi Anda contohnya.

switch (result) {
            case 0:
                result_amount = 500;
             break;

            case 1:
                result_amount = 600;
            break;
            case -1:
                result_amount = 700;
            break;

    } 

0
2017-08-12 08:25