Pertanyaan Mengapa kita perlu istirahat setelah pernyataan kasus?


Mengapa compiler tidak secara otomatis membuat pernyataan break setelah setiap blok kode di switch? Apakah itu karena alasan historis? Kapan Anda ingin beberapa blok kode dijalankan?


75
2018-04-25 22:58


asal


Jawaban:


Terkadang sangat membantu untuk memiliki beberapa kasus yang terkait dengan blok kode yang sama, seperti

case 'A':
case 'B':
case 'C':
    doSomething();
    break;

case 'D':
case 'E':
    doSomethingElse();
    break;

dll. Hanya sebuah contoh.

Dalam pengalaman saya, biasanya itu adalah gaya buruk untuk "jatuh" dan memiliki beberapa blok kode mengeksekusi untuk satu kasus, tetapi mungkin ada penggunaan untuk itu dalam beberapa situasi.


81
2018-04-25 23:02



Secara historis, itu karena case pada dasarnya mendefinisikan a label, juga dikenal sebagai titik target dari a goto panggilan. Pernyataan switch dan kasus-kasus yang terkait benar-benar hanya mewakili cabang multi-jalur dengan banyak titik masuk potensial ke dalam aliran kode.

Semua yang dikatakan, telah dicatat jumlah yang hampir tak terbatas kali itu break hampir selalu perilaku default yang Anda lebih suka miliki di akhir setiap kasus.


29
2018-04-25 23:20



Java berasal dari C dan itu adalah sintaks dari C.

Ada saat-saat di mana Anda ingin beberapa pernyataan kasus hanya memiliki satu jalur eksekusi. Di bawah ini adalah contoh yang akan memberi tahu Anda berapa hari dalam sebulan.

class SwitchDemo2 {
    public static void main(String[] args) {

        int month = 2;
        int year = 2000;
        int numDays = 0;

        switch (month) {
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                numDays = 31;
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                numDays = 30;
                break;
            case 2:
                if ( ((year % 4 == 0) && !(year % 100 == 0))
                     || (year % 400 == 0) )
                    numDays = 29;
                else
                    numDays = 28;
                break;
            default:
                System.out.println("Invalid month.");
                break;
        }
        System.out.println("Number of Days = " + numDays);
    }
}

25
2018-04-25 23:05



Anda dapat melakukan berbagai hal menarik dengan kasus gagal.

Misalnya, katakanlah Anda ingin melakukan tindakan tertentu untuk semua kasus, tetapi dalam kasus tertentu Anda ingin melakukan tindakan itu dan sesuatu yang lain. Menggunakan pernyataan switch dengan fall-through akan membuatnya cukup mudah.

switch (someValue)
{
    case extendedActionValue:
        // do extended action here, falls through to normal action
    case normalActionValue:
    case otherNormalActionValue:
        // do normal action here
        break;
}

Tentu saja, mudah untuk melupakan break pernyataan di akhir kasus dan menyebabkan perilaku yang tidak diharapkan. Compiler yang bagus akan memperingatkan Anda ketika Anda menghilangkan pernyataan istirahat.


12
2018-04-25 23:03



Saya pikir itu suatu kesalahan. Sebagai sebuah konstruksi bahasa, itu sama mudahnya break sebagai default dan sebaliknya memiliki fallthrough kata kunci. Sebagian besar kode yang saya tulis dan baca memiliki jeda setelah setiap kasus.


10
2018-04-25 23:07



Mengapa compiler tidak secara otomatis membuat pernyataan break setelah setiap blok kode di switch?

Mengesampingkan baik keinginan untuk dapat menggunakan blok yang sama untuk beberapa kasus (yang dapat dikhususkan khusus) ...

Apakah itu karena alasan historis? Kapan Anda ingin beberapa blok kode dijalankan?

Ini terutama untuk kompatibilitas dengan C, dan ini bisa dibilang hack kuno dari hari-hari tua ketika goto kata kunci menjelajahi bumi. Saya t tidak aktifkan beberapa hal luar biasa, tentu saja, seperti Perangkat Duff, tetapi apakah itu suatu titik yang menguntungkan atau melawan adalah ... argumentatif yang terbaik.


5
2018-04-25 23:12



Jadi Anda tidak perlu mengulang kode jika Anda perlu beberapa kasus untuk melakukan hal yang sama:

case THIS:
case THAT:
{
    code;
    break;
}

Atau Anda dapat melakukan hal-hal seperti:

case THIS:
{
   do this;
}
case THAT:
{
   do that;
}

Dalam mode cascade.

Benar-benar bug / kebingungan, jika Anda bertanya kepada saya.


4
2018-04-25 23:02



Java berasal dari C, yang warisan termasuk teknik yang dikenal sebagai Perangkat Duff . Ini adalah optimasi yang bergantung pada fakta bahwa kontrol jatuh dari satu kasus ke kasus berikutnya, dengan tidak adanya break;pernyataan. Pada saat C distandarisasi, ada banyak kode seperti itu "di alam liar", dan itu akan menjadi kontraproduktif untuk mengubah bahasa untuk memecahkan konstruksi seperti itu.


3
2018-04-25 23:10



Sejauh sejarah berjalan, Tony Hoare menemukan pernyataan kasus pada 1960-an, selama revolusi "pemrograman terstruktur". Pernyataan kasus Tony mendukung banyak label per kasus dan keluar otomatis tanpa bau break pernyataan. Persyaratan untuk eksplisit break adalah sesuatu yang keluar dari garis BCPL / B / C. Dennis Ritchie menulis (dalam ACM HOPL-II):

Sebagai contoh, endcase yang lolos dari pernyataan switchon BCPL tidak ada dalam bahasa   ketika kita mempelajarinya di tahun 1960-an, dan begitu banyak kata kunci istirahat untuk melarikan diri   dari pernyataan switch B dan C berutang ke evolusi yang berlainan daripada perubahan sadar.

Saya belum dapat menemukan tulisan sejarah tentang BCPL, tetapi komentar Ritchie menunjukkan bahwa break kurang lebih merupakan kecelakaan historis. BCPL kemudian memperbaiki masalahnya, tetapi mungkin Ritchie dan Thompson terlalu sibuk menciptakan Unix untuk terganggu dengan detail seperti itu :-)


3
2018-04-26 01:44



Tidak ada pemutusan otomatis yang ditambahkan oleh kompilator memungkinkan untuk menggunakan switch / case untuk menguji kondisi seperti itu 1 <= a <= 3 dengan menghapus pernyataan istirahat dari 1 dan 2.

switch(a) {
  case 1: //I'm between 1 and 3
  case 2: //I'm between 1 and 3
  case 3: //I'm between 1 and 3
          break;
}

0
2018-04-25 23:02