cari

Rumah  >  Soal Jawab  >  teks badan

c++ - Bagaimana untuk menangani situasi di mana lalai diletakkan di hadapan blok pernyataan suis

int c,i;
for (int i = 1; i < 3; ++i)
{
    switch (i)
    {
        default: c+=i;
        case 2: c++;break;
        case 4: c+=2;break;
    }
}
printf("%d\n", c);

Mengapa kod ini bersamaan dengan 3? Bukankah ini berlaku apabila lalai: c+=i; digunakan apabila i ialah 1 untuk kali pertama, dan kes 2: c++;break digunakan apabila i bersamaan dengan 2 untuk kali kedua? c=2 ialah output pada penghujungnya? Kenapa 3?

天蓬老师天蓬老师2722 hari yang lalu2511

membalas semua(3)saya akan balas

  • 女神的闺蜜爱上我

    女神的闺蜜爱上我2017-07-06 10:37:10

    Pertama sekali, mari kita jelaskan beberapa perkara yang perlu diperhatikan dalam suis:

    1.

    switch 语句体由一系列 case 标签和一个可选 default 标签组成。 case 语句中的两个常量表达式的计算结果不能为同一个值。 default 标签只能出现一次。 标记语句不是语法要求,但如果它们不存在,switch 语句是无意义的。默认语句(即default标签)无需显示在末尾;它可以显示在 switch 语句体的任何位置casedefault 标签只能显示在 switch dalam penyata.
    Dipetik daripada: Dokumentasi rasmi penyata Microsoft Visual Studio 2015 c++ Switch

    2.

    Skop casedefault本身就是标签,就是告诉编译器从满足这个标签开始向后执行,之后不会再判断其他标签的正确性,直到break语句或者switch pernyataan yang dinyatakan di atas tamat.

    Untuk masalah ini

    LANGKAH 1 : Apabila i=1, kerana i!=2&&i!=4, pelaksanaan bermula selepas teg default This When melaksanakan pernyataan c+=i; (kami kini menganggap bahawa pengkompil memulakan c kepada 0 untuk anda, anda mesti tahu bahawa tidak semua penyusun begitu mesra) nilai c selepas pelaksanaan ialah 1; LANGKAH 2i=1时,由于i!=2&&i!=4故从default标签后开始执行,此时执行语句c+=i;(我们现在就假设编译器帮你把c初始化为0,要知道并不是所有的编译器都这么友好)执行后c的值为1;
    STEP 2:综合上述1,2可知由于此时没有碰到任何break语句也没有到switch语句的作用域结束(因为这个default语句是放在第一个的)所以它接着向后执行case 2后的语句(此时编译器已经不看满不满足case标签了)此时执行语句c++;执行后c的值为2;遇到break语句跳出switch语句。
    STEP 3:当i=2时,由于i满足case 2的情况,所以直接从case 2便签后的语句开始执行,此时执行语句c++,执行后c的值为3,遇到break语句跳出switch语句。
    STEP 4:当i=3时,跳出for: Berdasarkan 1 dan 2 di atas, dapat dilihat bahawa kerana tiada pernyataan break ditemui pada masa ini dan skop pernyataan suis belum berakhir (kerana default Penyataan ini diletakkan dahulu), jadi ia kemudian melaksanakan pernyataan selepas case 2 ke belakang (pada masa ini, pengkompil belum memenuhi case Label) Pada masa ini, pernyataan c++ dilaksanakan nilai c selepas pelaksanaan ialah 2 apabila kenyataan break ditemui, iaitu tukar lompat keluar.
    LANGKAH 3: Apabila i=2, memandangkan saya memenuhi situasi case 2, jadi ikuti terus kenyataan selepas case 2 nota Mulakan pelaksanaan Pada masa ini, pernyataan c++ dilaksanakan Selepas pelaksanaan, nilai c ialah 3. Apabila pernyataan break ditemui, suis . pernyataan dilonjak keluar.

    🎜LANGKAH 4🎜: Apabila i=3, lompat keluar daripada gelung for dan keluarkan c=3 🎜🎜 (Proses di atas ialah kesimpulan yang saya buat menggunakan Visual Studio 2015 penyahpepijatan satu langkah; dan menggabungkan data) 🎜 🎜

    balas
    0
  • 三叔

    三叔2017-07-06 10:37:10

    Apabila i=1, ia memasuki lalai: c=1 dan tiada patah, jadi teruskan padankan kes 2 dan dapatkan rehat c=2
    Apabila i=2, ia sepadan dengan kes 2 dahulu dan masukkan kes 2: c=3 putus
    Apabila i=3 Kitaran tidak bertahan.
    Keluaran c ialah 3

    balas
    0
  • 三叔

    三叔2017-07-06 10:37:10

    var c = 0,i;
    for (var i = 1; i < 3; ++i)
    {
        switch (i) {
            default: c+=i;console.log('defalult:'+c);
            case 2: c++;console.log('case2:'+c);break;
            case 4: c+=2;console.log('case4:'+c);break;
        }
        console.log(i, c);
    }
    console.log('last:'+c);

    balas
    0
  • Batalbalas