这种switch语句块中default放前面的情况怎么走
```
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);

```
这个代码为什么会等于3啊？这里面不是default第一次i为1的时候走default: c+=i;，第二次i等于2就走case 2: c++;break;然后就结束，最后输出c=2吗？为什么是3呢？
首先明确一下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单步调试并结合资料得出的结论）