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?
Pertama sekali, mari kita jelaskan beberapa perkara yang perlu diperhatikan dalam suis:
1.
switch语句体由一系列case标签和一个可选default标签组成。case语句中的两个常量表达式的计算结果不能为同一个值。default标签只能出现一次。 标记语句不是语法要求,但如果它们不存在,switch语句是无意义的。默认语句(即default标签)无需显示在末尾;它可以显示在 switch 语句体的任何位置。case或default标签只能显示在switchdalam penyata.Dipetik daripada: Dokumentasi rasmi penyata Microsoft Visual Studio 2015 c++ Switch
2.
Skop
case和default本身就是标签,就是告诉编译器从满足这个标签开始向后执行,之后不会再判断其他标签的正确性,直到break语句或者switchpernyataan yang dinyatakan di atas tamat.Untuk masalah ini
LANGKAH 1 : Apabila
🎜LANGKAH 4🎜: Apabila i=3, lompat keluar daripada gelungi=1, keranai!=2&&i!=4, pelaksanaan bermula selepas tegdefaultThis When melaksanakan pernyataanc+=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 pernyataanbreakditemui pada masa ini dan skop pernyataansuisbelum berakhir (keranadefault Penyataanini diletakkan dahulu), jadi ia kemudian melaksanakan pernyataan selepascase 2ke belakang (pada masa ini, pengkompil belum memenuhicaseLabel) Pada masa ini, pernyataanc++dilaksanakan nilai c selepas pelaksanaan ialah 2 apabila kenyataanbreakditemui, iaitutukarlompat keluar.LANGKAH 3: Apabila
i=2, memandangkan saya memenuhi situasicase 2, jadi ikuti terus kenyataan selepascase 2nota Mulakan pelaksanaan Pada masa ini, pernyataanc++dilaksanakan Selepas pelaksanaan, nilai c ialah 3. Apabila pernyataanbreakditemui, suis.pernyataan dilonjak keluar.fordan keluarkan c=3 🎜🎜 (Proses di atas ialah kesimpulan yang saya buat menggunakan Visual Studio 2015 penyahpepijatan satu langkah; dan menggabungkan data) 🎜 🎜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