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
标签只能显示在switch
dalam penyata.Dipetik daripada: Dokumentasi rasmi penyata Microsoft Visual Studio 2015 c++ Switch
2.
Skop
case
和default
本身就是标签,就是告诉编译器从满足这个标签开始向后执行,之后不会再判断其他标签的正确性,直到break
语句或者switch
pernyataan 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 tegdefault
This 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 pernyataanbreak
ditemui pada masa ini dan skop pernyataansuis
belum berakhir (keranadefault Penyataan
ini diletakkan dahulu), jadi ia kemudian melaksanakan pernyataan selepascase 2
ke belakang (pada masa ini, pengkompil belum memenuhicase
Label) Pada masa ini, pernyataanc++
dilaksanakan nilai c selepas pelaksanaan ialah 2 apabila kenyataanbreak
ditemui, iaitutukar
lompat keluar.LANGKAH 3: Apabila
i=2
, memandangkan saya memenuhi situasicase 2
, jadi ikuti terus kenyataan selepascase 2
nota Mulakan pelaksanaan Pada masa ini, pernyataanc++
dilaksanakan Selepas pelaksanaan, nilai c ialah 3. Apabila pernyataanbreak
ditemui, suis.
pernyataan dilonjak keluar.for
dan 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