84669 人が学習中
152542 人が学習中
20005 人が学習中
5487 人が学習中
7821 人が学習中
359900 人が学習中
3350 人が学習中
180660 人が学習中
48569 人が学習中
18603 人が学習中
40936 人が学習中
1549 人が学習中
1183 人が学習中
32909 人が学習中
なぜこのコードは 3 なのでしょうか?初めて i が 1 のときは、default: c =i; が使用され、2 回目の i が 2 のときは、case 2: c ;break; が使用されるケースではないでしょうか? それで終了し、c=結局2が出力されるのか?なぜ 3 なのでしょうか?
欢迎选择我的课程,让我们一起见证您的进步~~
首先明确一下switch中的一些注意点:
switch 语句体由一系列 case 标签和一个可选 default 标签组成。 case 语句中的两个常量表达式的计算结果不能为同一个值。 default 标签只能出现一次。 标记语句不是语法要求,但如果它们不存在,switch 语句是无意义的。默认语句(即default标签)无需显示在末尾;它可以显示在 switch 语句体的任何位置。 case 或 default 标签只能显示在 switch 语句内。 摘自:Microsoft Visual Studio 2015 c++ Switch语句官方文档
switch
case
default
上述所说的case和default本身就是标签,就是告诉编译器从满足这个标签开始向后执行,之后不会再判断其他标签的正确性,直到break语句或者switch语句的作用域结束。
break
STEP 1 :当i=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循环输出c=3; (上述过程为本人用 Visual Studio 2015单步调试并结合资料得出的结论)
i=1
i!=2&&i!=4
c+=i;
case 2
c++
i=2
for
当i=1时候 进入default: c=1 没有break 所以继续向下匹配case 2 得c=2 break当i=2时候 优先匹配case 2 进入case 2: c=3 break当i=3时候 循环不成立。输出c为3
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);
首先明确一下switch中的一些注意点:
1.
switch
语句体由一系列case
标签和一个可选default
标签组成。case
语句中的两个常量表达式的计算结果不能为同一个值。default
标签只能出现一次。 标记语句不是语法要求,但如果它们不存在,switch
语句是无意义的。默认语句(即default
标签)无需显示在末尾;它可以显示在 switch 语句体的任何位置。case
或default
标签只能显示在switch
语句内。摘自:Microsoft Visual Studio 2015 c++ Switch语句官方文档
2.
上述所说的
case
和default
本身就是标签,就是告诉编译器从满足这个标签开始向后执行,之后不会再判断其他标签的正确性,直到break
语句或者switch
语句的作用域结束。For this problem
STEP 1 :当
i=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
循环输出c=3;(上述过程为本人用 Visual Studio 2015单步调试并结合资料得出的结论)
当i=1时候 进入default: c=1 没有break 所以继续向下匹配case 2 得c=2 break
当i=2时候 优先匹配case 2 进入case 2: c=3 break
当i=3时候 循环不成立。
输出c为3